仓酷云

标题: PHP网页编程之php中完成多线程 [打印本页]

作者: 活着的死人    时间: 2015-2-4 00:11
标题: PHP网页编程之php中完成多线程
没有人会喜欢和见异思迁的人交朋友,因为这种人太不安分,太不可靠,因此,你必须要强迫自己完成自己的目标,哪怕可能会很难受,也得坚持,毅力就是这么锻炼出来的。多线程       PHP中完成多线程? 看到这个题目, 你必定觉得我疯了..然而现实上我真的这么做了.
   
  上面是我的一些做法, 已实行过. 的确可以的.
   
  咱们晓得PHP自己是不撑持多线程的, 然而咱们的WEB办事器是撑持多线程的.
   
  也就是说可以同时让多人一同会见. 这也是我在PHP中完成多线程的基本.
   
  假定咱们如今运转的是a.php这个文件. 然而我在法式中又恳求WEB办事器运转另外一个b.php
   
  那末这两个文件将是同时履行的.
   
  (PS: 一个链接恳求发送以后, WEB办事器就会履行它, 而不论客户端是不是已加入)
   
  有些时分, 咱们想运转的不是另外一个文件, 而是本文件中的一局部代码.该怎样办呢?
   
  其实可是经由过程参数来掌握a.php来运转哪一段法式.
   
  上面看一个例子:
   
  //a.php
   
   
  PHP代码:--------------------------------------------------------------------------------
   
  <?php
   function runThread()
   {
   $fp = fsockopen('localhost', 80, $errno, $errmsg);
   
   fputs($fp, "GET /a.php?act=b\r\n\r\n"); //这里的第二个参数是HTTP协定中划定的恳求头
   //不分明的请看RFC中的界说
   
   fclose($fp);
   }
   
   function a()
   {
   $fp = fopen('result_a.log', 'w');
   fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "\r\n");
   
   fclose($fp);
   }
   
   function b()
   {
   $fp = fopen('result_b.log', 'w');
   fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "\r\n");
   
   fclose($fp);
   }
   
   if(!isset($_GET['act'])) $_GET['act'] = 'a';
   
   if($_GET['act'] == 'a')
   {
   runThread();
   a();
   }
   else if($_GET['act'] == 'b') b();
  ?>
   
  --------------------------------------------------------------------------------
   
   
  翻开result_a.log 和 result_b.log 对照一下两个文件的中会见的工夫. 人人会发明, 这两个切实其实是在分歧线程中运转的.
  有些工夫完整一样.
   
  下面只是一个复杂的例子, 人人可以改善成其它模式.
   
   
  既然PHP中也能多线程了, 那末成绩也来了, 那就是同步的成绩. 咱们晓得 PHP自己是不撑持多线程的. 所以更不会有甚么像
   
  Java 中synchronize的办法了. 那咱们该若何做呢.
   
  1. 尽可能不会见统一个资本. 以免抵触. 然而可以同时像数据库操作. 由于数据库是撑持并发操作的. 所以在多线程的PHP中
   
  不要向统一个文件中写入数据. 假如必需要写的话, 用其余办法停止同步.. 如挪用 flock对文件停止加锁等. 或创立一时文件
   
  并在别的的线程中守候这个文件的消逝 while(file_exits('xxx')); 如许就等于这个一时文件存在时, 暗示其实线程正在操作
   
  假如没有了这个文件, 申明其它线程已释放了这个.
   
  2. 尽可能不要从runThread在履行fputs后取这个socket中读取数据. 由于要完成多线程, 需求的用非壅塞形式. 即在像fgets这
   
  样的函数时当即前往.. 所以读写数据就会出成绩. 假如利用壅塞形式的话, 法式就不算是多线程了. 他要等下面的前往才履行
   
  上面的法式. 所以假如需求互换数据最初使用里面文件或数据中完成. 其实想要的话就用socket_set_nonblock($fp) 来完成.
   
   
  说了这么多, 倒底这个有无实践的意义呢? 在甚么时分需求这类用这类办法呢 ?
   
  谜底是一定的. 人人晓得. 在一个不休读取收集资本的使用中, 收集的速度是瓶颈. 假如采多这类模式就能够同时以多个线程对
   
  分歧的页面停止读取.
   
  自己做的一个能从8848、soaso这些商城网站搜刮信息的法式。还有一个从阿里巴巴网站上读取贸易信息和公司目次的法式也用到
   
  了此手艺。 由于这两个法式都是要不休的链接它们的办事器读守信息并保留到数据库。 使用此手艺正好消弭了在守候呼应时的瓶颈。
小试一下身手,大概是没问题了,那么交给你个任务,做个留言本吧,这和HELLO WORLD有一比啊!^_^,同是新手面临的第一道关。
作者: 简单生活    时间: 2015-2-4 09:52
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
作者: 海妖    时间: 2015-2-7 19:41
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
作者: 爱飞    时间: 2015-2-13 01:50
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
作者: 第二个灵魂    时间: 2015-2-23 02:59
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
作者: 深爱那片海    时间: 2015-2-28 16:31
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
作者: 山那边是海    时间: 2015-3-3 19:47
首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。
作者: 仓酷云    时间: 2015-3-7 00:09
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
作者: 灵魂腐蚀    时间: 2015-3-10 13:10
微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox  支持的不是很好,所以能少用还是少用的好。
作者: 愤怒的大鸟    时间: 2015-3-11 15:11
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
作者: 小魔女    时间: 2015-3-14 17:46
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
作者: 金色的骷髅    时间: 2015-3-21 12:28
为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
作者: 精灵巫婆    时间: 2015-3-23 08:18
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
作者: 透明    时间: 2015-4-6 22:10
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
作者: 因胸联盟    时间: 2015-4-16 05:11
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
作者: 谁可相欹    时间: 2015-4-19 11:33
Ps:以上纯属原创,如有雷同,纯属巧合
作者: 飘飘悠悠    时间: 2015-4-22 02:12
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
作者: 活着的死人    时间: 2015-5-1 21:28
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
作者: 乐观    时间: 2015-5-12 00:42
基础有没有对学习php没有太大区别,关键是兴趣。
作者: 兰色精灵    时间: 2015-6-16 10:16
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2