zoukankan      html  css  js  c++  java
  • php如何进行多进程与异步调用方法

    浏览器和服务器之间只一种面向无连接的HTTP协议进行通讯的,面向无连接的程序的特点是客户端请求服务端,服务端根据请求输出相应的程序,不能保持持久连接。

    这样就出现了一个问题,一个客户端的相应服务端可能执行1秒也有可能执行1分钟,这样浏览器就会一直处于等待状态,如果程序执行缓慢,用户可能就没耐心关掉了浏览器。

    而有的时候我们不需要关心程序执行的结果,没有必要这样浪费时间和耐心等待,那我们就要想出办法让程序不收等待在后台静默执行。

    根据个人的总结,总结了如下方法:

    1.客户端页面采用AJAX技术请求服务器

       大多用于提升用户的体验而弄。

    2 利用linux多进程与php函数相结合

     利用php的popen函数打开进程文件指针,配合linux命令,打开的多进程趋于稳定。

    $cmd = "cd /dir/代码目录;php index.php method >> ".$log_file." &";
    // linux命令 ,建议把执行结果输出于日志

    for($i = 1; $i <= $thisPlantaskConfig['thread']; $i++)  //用参数thread控制开启的进程数
    {
         pclose(popen($cmd, "w"));  //打开进程
         usleep(mt_rand(100,500));  //间隔打开
    }

    这样子开启的多进程模式会存在某些缺陷,在后期的文章中会提及

    3 远程请求的多进程

      curl的多线程操作,创建批处理句柄,发出多请求,不用等待上个请求是否成功

    <?php
    // 创建一对cURL资源
    $ch1 = curl_init();
    $ch2 = curl_init();
    
    // 设置URL和相应的选项
    curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/");
    curl_setopt($ch1, CURLOPT_HEADER, 0);
    curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
    curl_setopt($ch2, CURLOPT_HEADER, 0);
    
    // 创建批处理cURL句柄
    $mh = curl_multi_init();
    
    // 增加2个句柄
    curl_multi_add_handle($mh,$ch1);
    curl_multi_add_handle($mh,$ch2);
    
    $active = null;
    // 执行批处理句柄
    do {
        $mrc = curl_multi_exec($mh, $active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    
    while ($active && $mrc == CURLM_OK) {
        if (curl_multi_select($mh) != -1) {
            do {
                $mrc = curl_multi_exec($mh, $active);
            } while ($mrc == CURLM_CALL_MULTI_PERFORM);
        }
    }
    
    // 关闭全部句柄
    curl_multi_remove_handle($mh, $ch1);
    curl_multi_remove_handle($mh, $ch2);
    curl_multi_close($mh);
    
    ?> 

    4 使用某些扩展

     利用某些通信扩展,例如php-process

       当然,我个人不建议使用这个。

    5 利用开源项目

       善于利用前辈的经验,站在巨人的肩膀上。

      swoole 和 workerman 是我个人认为非常过优秀的异步,并行,高性能的网络通信框架,值得学习

  • 相关阅读:
    windows2008R2下iis7.5中的url重写(urlrewrite)
    C#操作IIS程序池及站点的创建配置实现代码
    C#获取IP及MAC地址 方法
    linq list select用法注意事项
    c#写windows服务 小demo
    C#创建Windows Service(Windows 服务)基础教程
    C# 编写Windows Service(windows服务程序)
    C#中DataTable中的Compute方法使用收集
    SQL Delta实用案例介绍,很好的东西,帮了我不少忙
    Linq中demo,用力看看吧
  • 原文地址:https://www.cnblogs.com/zhenghongxin/p/6624894.html
Copyright © 2011-2022 走看看