您好,欢迎访问一九零五行业门户网

PHP 异步执行方法,模拟多线程的应用分析_PHP教程

php 本身没有多线程的东西,但可以曲线的办法来造就出同样的效果,比如多进程的方式来达到异步调用,只限于命令模式。
另外还有一种更简单的方式可用于 web 程序中,那就是用 fsockopen()、fputs() 来请求一个 url, 而无需等待返回,如果你在那个被请求的页面(url)中做些事情就相当于异步了。
关键代码如下:
复制代码 代码如下:
点提交按钮 -> 日志插入到数据库 -> 发送邮件通知 -> 告知撰写者发布成功
那么作者在点提交按钮到看到成功提示之间可能会等待很常时间,基本是在等邮件发送的过程,比如连接邮件服务异常、或器缓慢或是订阅者太多。而实际上是不管邮件发送成功与否,保证日志保存成功基本可接受的,所以等待邮件发送的过程是很不经济的,这个过程可异步来执行,并且邮件发送的结果不太关心或以日志形式记录备查。
改进后的流程就是:
日志写完 -> 点提交按钮 -> 日志插入到数据库 ---> 告知撰写者发布成功
                                                           └ 发送邮件通知 -> [记下日志]
写个实际的程序来测试一下,有两个文件,分别是 write.php 和 sendmail.php,在 sendmail.php 用 sleep(seconds) 来模拟程序执行所使用时间。
write.php,执行耗时 1 秒:
复制代码 代码如下:
  function asyn_sendmail()
     {
         $fp = fsockopen('localhost',80,&$errno,&$errstr,5); 
      if(!$fp)
         {
            echo $errstr ($errno)
/n;
         }
     sleep(1);
     fputs($fp,get /sendmail.php?param=1/r/n); #请求的资源 url 一定要写对
     fclose($fp);
    } 
 echo time().'
';
 echo 'call asyn_sendmail
';
 asyn_sendmail();
 echo time().'
';
sendmail.php,执行耗时 10 秒:
复制代码 代码如下:
sleep(10);
fopen(c:/ . time(),  w);
通过页面访问 write.php,页面输出:
1272472697
call asyn_sendmail
1272472698
并且在 c:/ 生成文件:
1272472708
从上面的结果可以看出 sendmail.php 至少花费 10 秒,但不会阻塞 write.php 继续往下执行,表明这一过程是异步的。
http://www.bkjia.com/phpjc/327227.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/327227.htmltecharticlephp 本身没有多线程的东西,但可以曲线的办法来造就出同样的效果,比如多进程的方式来达到异步调用,只限于命令模式。 另外还有一种更...
其它类似信息

推荐信息