php的异步请求操作

PHP

#异步请求2012-04-15 00:21

在很多情况下,有这样的一个需求:让php在后台执行某个程序,但要让页面快速的输出显示。

以下是我总结的几种实现方式

exec

这是最简单的方式

exec(sprintf("%s > %s 2>&1 & echo $! > %s", $cmd, $outputfile, $pidfile));

调用$cmd命令,将输出重定向到$outputfile,不显示错误信息,同时将进程id输出到$pidfile。

这样也方便监控,比如判断该进程是否还在运行

function isRunning($pid){

try{

$result = shell_exec(sprintf("ps %d", $pid));

if( count(preg_split("/\n/", $result)) > 2){

return true;

}

}catch(Exception $e){}

return false;

}

注意:如果直接调用exec来运行某个命令,或者在该命令后面加个"&",php还是会等待该命令运行完成再执行下面的操作。

proc_open/proc_close这个方法很有意思,先用proc_open运行一段后台程序,然后用proc_close来关闭proc_open,结果程序就在后台运行了,同时php也会继续执行下去

proc_close(proc_open ("ping www.baidu.com -c 10 > /path/to/output &", array(), $foo));

pcntl_fork

使用php的多线程来达到目的,原理就是复制一个子线程,同时杀死父线程(不支持windows)。

if ($pid = pcntl_fork())

die(); // Parent

function shutdown() {

posix_kill(posix_getpid(), SIGHUP);

}

if(ob_get_level()) ob_end_clean(); // Discard the output buffer and close

fclose(STDIN); // Close all of the standard

fclose(STDOUT); // file descriptors as we

fclose(STDERR); // are running as a daemon.

register_shutdown_function('shutdown');

if (posix_setsid() < 0)

die(); //

// Do your stuff here

exec('/bash/command > /path/to/output');

header

使用这个方法的前提是使用http协议,同时目标文件可控,最好在一个域下。因为必须要建立http连接才行,所以稍微有点费时。原理是通过header输出’Connection:close’头,中断http连接,同时后面的代码继续执行。

while(ob_get_level()) ob_end_clean();

header('Connection: close');

ignore_user_abort();

ob_start();

echo('Connection Closed');

$size = ob_get_length();

header("Content-Length: $size");

ob_end_flush();

flush();

使用数据库作中转

把要执行的命令和参数先存到缓存或数据库,接下来的事就不用php操心了。

相关文章

php处理异步请求_php的异步请求操作相关推荐

  1. php通过post请求_php代码post请求

    /** * 发送post请求 * @param string $url 请求地址 * @param array $post_data post键值对数据 * @return string */ fun ...

  2. php处理异步请求_PHP实现异步调用方法研究

    浏览器和服务器之间是通过 HTTP 协议进行连接通讯的.这是一种基于请求和响应模型的协议.浏览器通过 URL 向服务器发起请求,Web 服务器接收到请求,执行一段程序,然后做出响应,发送相应的html ...

  3. php 模拟并发请求_PHP模拟并发请求

    原理:使用curl_init()创建多个请求实例,再使用curl_multi_init()批量执行创建的多个请求实例. 文件1:curl.php<?php $threads=500;//并发请求 ...

  4. 小程序promise封装post请求_微信小程序 es6-promise.js封装请求与处理异步进程

    微信小程序 es6-promise.js封装请求与处理异步进程 下载es6-promise.js置于根目录下的libs文件夹下: 在根目录utils文件夹下新建httpsPromisify.js,即定 ...

  5. ajax异步详解同步请求,ajax async异步请求和同步请求

    ajax async异步请求和同步请求 ajax是指异步加载.这个异步是相对于页面来说的,页面不刷新就加载服务器数据.ajax中的请求又分为同步请求和异步请求,这里是相对于进程来说的,ajax异步请求 ...

  6. 原生Ajax请求流程:同步请求、异步请求

    Ajax 异步无刷新技术 原生Ajax的实现流程 得到XMLHttpRequest对象 - var xhr = new XMLHttpRequest(); 打开请求 - xhr.open(method ...

  7. php 5w的并发需要多少台服务器_php使用异步编程是怎样的?

    前言 传统的 php-fpm 一个进程执行一个请求,要达到多少并发,就要生成多少个进程.更糟糕的是每次请求都需要重新编译执行,导致并发一直上不来.因此出现了 Swoole 和 WorkerMan 两个 ...

  8. php获取curl头_php中CURL请求头和响应头获取方法

    本文主要和大家分享php中CURL请求头和响应头获取方法,希望能帮助到大家. 1.从CURL中获取响应头$oCurl = curl_init(); // 设置请求头, 有时候需要,有时候不用,看请求网 ...

  9. php curl json post请求_php post请求发送json对象数据参数

    网页中发送请求时,大部分情况都参数以键值组合发送数据的,而一些第三方如java开发的接口中需要发送post请求,请求参数为json类型. 既然要发送json数据,首页我们需要在请求头中定义数据类型为j ...

最新文章

  1. 农行计算机安全制度,制度体系之农行 数据中心计算机安全检查实施细则.doc
  2. Android—TableLayout自定义表格
  3. HHT变换基本理论-学习笔记
  4. 文字描边_如何在网页里实现文字描边效果
  5. 【解决】make: 警告:检测到时钟错误。您的创建可能是不完整的
  6. android Intent的介绍
  7. C语言程序设计第9堂作业
  8. 7个碎片的excel重组实验
  9. 【不生气的智慧】王焕斌--书记
  10. 【自动驾驶】常见位姿估计算法的比较: 三角测量、PNP、ICP、
  11. 硬盘分区修复和碎片整理命令
  12. BTC源码分析 交易(一)
  13. Linux群组与文件权限
  14. 【计算机网络】DNS域名解析
  15. 你是我的四月天[转自天涯]
  16. == 和 equal
  17. 如何在Genymotion VM中安装Google Play服务(没有拖放支持)?
  18. 生成EXCEL(不使用模板)
  19. Angular ng-model指令详解
  20. 爬取去哪儿网旅游数据并且保存为csv文件

热门文章

  1. ROS vim退出快捷键
  2. 如何制作MiniTool数据恢复工具启动光盘或启动U盘?
  3. VM虚拟机开防检测 [ 游戏不能登录处理详解 ]
  4. STM32F103 NVIC嵌入式中断控制器
  5. openlayers官方教程(一)Introduction
  6. KMSpico_setup安装报病毒解决办法
  7. python将object转换为float_DataFrame中的object转换成float的方法
  8. 2015(第四届)中国信息化和工业化融合发展高峰论坛第二天-黄培博士讲座课件...
  9. 聋校计算机教学工作总结,2014年年上半年聋校七年级数学教学工作总结
  10. SI24R2E应用于2.4G有源RFID养老院方案