PHP异步实现

最近由于工作的需要,也在用PHP做一些异步的功能。我面临需求:根据查询条件不同生成Hadoop执行sql(用PHP),用thrift做跨语言通信功能,用Hadoop计算数据生成文件,最后用PHP发邮件。

PHP异步或模拟异步可用方法

  • curl
  • fsockopen
  • popen

curl
curl 本身没有异步功能,是阻塞模式运行,只是我们可以通过设置一个等待时间来 控制请求的响应速度。即设置CURLOPT_TIMEOUT(0为无限等待)。

使用curl异步访问:
$ch = curl_init();
        $data = [
            'sql' =>1,
            'where'=>2
        ];
        curl_setopt($ch, CURLOPT_URL, "http://ci.dev/index.php/welcome/sync1?sql=123");
        //设置头文件的信息作为数据流输出
        curl_setopt($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT,1);
        curl_setopt($ch, CURLOPT_POST,TRUE);//TRUE 时会发送 POST 请求
        //设置post数据
        curl_setopt($ch, CURLOPT_POSTFIELDS,$data);//
        //设置获取的信息以文件流的形式返回,而不是直接输出。
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        //执行命令
        curl_exec($ch);
        //关闭句柄
        curl_close($ch);

fsockopen
fsockopen 与 curl 本身没什么区别,最大不同fsockopen 要自己拼接头。默认情况下将以阻塞模式开启套接字连接。当然你可以通过stream_set_blocking()将它转换到非阻塞模式。

注意:记得在我测试的时候,一直测试不成功,原来是请求头 与 响应数据 有个空行(回车+换行)

使用fsocketopen()异步:
public  function syncbySocket(){
        $len = strlen('123');
        $host= "www.ci.dev";
        $path='/index.php/welcome/syncwrite';
        $fp = fsockopen($host, 80, $errno, $errstr, 1);//最后一个是连接超时
        if($fp){
            $header =  "POST $path HTTP/1.1\r\n";
            $header .= "Host: $host\r\n";
            $header .= "Content-type: application/x-www-form-urlencoded\r\n";
            $header .= "Content-Length: $len\r\n";
            $header .= "Connection: close\r\n\r\n";//注意是双斜杠
            fwrite($fp,$header);
            /*while (!feof($fp)) {
                echo fgets($fp, 1024);
            }*/
            fclose($fp);
            echo 'ok';
        }else{
            echo $errstr;
        }

    }    

popen
本质打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。 但运行代码还是会 等待数据返回 在向下执行。
由于运行的是一个命令,在Linux中 在命令后面 加 & 就表示把进程放到后台运行,如果我们需要运行的结果我们可 通过 数据流重定向 获取。

pclose(popen("/home/work/php/bin/php /home/work/index.php Pollpayment_order pull >> /home/work/tmp/errorlog &",
            "r"));

注意下面执行还是阻塞模式
pclose(popen("/home/work/php/bin/php /home/work/index.php Pollpayment_order pull >> /home/work/tmp/errorlog",
            "r"));
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值