|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
没有人会喜欢和见异思迁的人交朋友,因为这种人太不安分,太不可靠,因此,你必须要强迫自己完成自己的目标,哪怕可能会很难受,也得坚持,毅力就是这么锻炼出来的。多线程 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有一比啊!^_^,同是新手面临的第一道关。 |
|