zoukankan      html  css  js  c++  java
  • 如何实现php异步处理

    在实际生成环境下,php作为后台的接口服务器已经很常见,php当然具有它能作为后台服务器的优势之处,但是,在处理一些客户端并不关心的结果时,就显出它的弊端了---没有异步执行的机制。就比如我们想做一些对于某次客户端访问php的性能记录(包括开始时间、结束时间、此次结果状态等)的纪录时,客户端当然想的是php的本次处理能够早点回复,拿到结果,而如果安装常规的方案,客户端就得等php做完性能记录之后,才能拿到结果。相当于你去银行去查你现在的余额,而柜员跑过去跟其他人闹了一会儿的磕,在来告诉你的结果一样。

    所以,很多时候,就需要一种php能执行异步操作。

    那怎么才能实现异步呢?

    其中一种方案就是利用php的系统调用,开启新的进程来实现。

    php 提供了fsockopen函数,此函数的功能为初始化一个套接字连接到指定主机,默认情况下将以阻塞模式开启套接字连接。当然你可以通过stream_set_blocking()将它转换到非阻塞模式。这是关键。所以,思路就是:开启一个非阻塞的套接字连接到本机,本机收到之后作一些耗时处理。

    类似这样的处理代码(文件posttest.php):

    $fp = fsockopen($php_Path,80);
    if (!$fp) {
    LMLog::error("fsockopen:err" );
    } else {
    $out = "GET /album/action/album_write_friends_thread_record.php?key=&u= HTTP/1.1 ";
    $out .= "Host: ".$php_Path." ";
    $out .= "Connection: Close ";
    stream_set_blocking($fp,true);
    stream_set_timeout($fp,1);
    fwrite($fp, $out);
    usleep(1000);
    fclose($fp);
    }

    这里,usleep(1000) 非常关键,它能保证这个请求能发出去。

    我们在来看处理的代码逻辑(文件album_write_friends_thread_record.php

    <?php
    /**
    * Created by PhpStorm.
    * User: Administrator
    * Date: 2016-09-23
    * Time: 09:26
    */
    /**
    * 客户端调用服务器接口页面
    * user: guwen
    */
    sleep(20);// 睡眠20s
    ?>
    实际上,我们服务器在执行fsockopen 那段程序时,就不会再等20s之后才能返回给客户端,而是发出这个请求之后,即返回客户端,销毁进程,而把剩余的工作交由其他进程慢慢做去,这就实现了php的异步。

  • 相关阅读:
    关于xml的使用。
    Input标签文件上传,使用详解
    webpack 集成 Typescript && Less
    ionic3 多级联动城市选择插件 ion-multi-picker
    ionic2(3) 密码键盘组件 ionic2-pincode-input 使用
    ionic3 图片(轮播)预览 ionic-gallary-modal组件使用方法
    ios打包,通过Xcode生成ipa文件
    php常见的验证方法
    php 时间转化为刚刚、几秒前、几分前、几天前等等,友好时间提示
    ionic node-sass安装或编译失败:MSBUILD : error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”
  • 原文地址:https://www.cnblogs.com/JDtech/p/6418438.html
Copyright © 2011-2022 走看看