php处理异步请求_php的异步请求操作
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的异步请求操作相关推荐
- php通过post请求_php代码post请求
/** * 发送post请求 * @param string $url 请求地址 * @param array $post_data post键值对数据 * @return string */ fun ...
- php处理异步请求_PHP实现异步调用方法研究
浏览器和服务器之间是通过 HTTP 协议进行连接通讯的.这是一种基于请求和响应模型的协议.浏览器通过 URL 向服务器发起请求,Web 服务器接收到请求,执行一段程序,然后做出响应,发送相应的html ...
- php 模拟并发请求_PHP模拟并发请求
原理:使用curl_init()创建多个请求实例,再使用curl_multi_init()批量执行创建的多个请求实例. 文件1:curl.php<?php $threads=500;//并发请求 ...
- 小程序promise封装post请求_微信小程序 es6-promise.js封装请求与处理异步进程
微信小程序 es6-promise.js封装请求与处理异步进程 下载es6-promise.js置于根目录下的libs文件夹下: 在根目录utils文件夹下新建httpsPromisify.js,即定 ...
- ajax异步详解同步请求,ajax async异步请求和同步请求
ajax async异步请求和同步请求 ajax是指异步加载.这个异步是相对于页面来说的,页面不刷新就加载服务器数据.ajax中的请求又分为同步请求和异步请求,这里是相对于进程来说的,ajax异步请求 ...
- 原生Ajax请求流程:同步请求、异步请求
Ajax 异步无刷新技术 原生Ajax的实现流程 得到XMLHttpRequest对象 - var xhr = new XMLHttpRequest(); 打开请求 - xhr.open(method ...
- php 5w的并发需要多少台服务器_php使用异步编程是怎样的?
前言 传统的 php-fpm 一个进程执行一个请求,要达到多少并发,就要生成多少个进程.更糟糕的是每次请求都需要重新编译执行,导致并发一直上不来.因此出现了 Swoole 和 WorkerMan 两个 ...
- php获取curl头_php中CURL请求头和响应头获取方法
本文主要和大家分享php中CURL请求头和响应头获取方法,希望能帮助到大家. 1.从CURL中获取响应头$oCurl = curl_init(); // 设置请求头, 有时候需要,有时候不用,看请求网 ...
- php curl json post请求_php post请求发送json对象数据参数
网页中发送请求时,大部分情况都参数以键值组合发送数据的,而一些第三方如java开发的接口中需要发送post请求,请求参数为json类型. 既然要发送json数据,首页我们需要在请求头中定义数据类型为j ...
最新文章
- 农行计算机安全制度,制度体系之农行 数据中心计算机安全检查实施细则.doc
- Android—TableLayout自定义表格
- HHT变换基本理论-学习笔记
- 文字描边_如何在网页里实现文字描边效果
- 【解决】make: 警告:检测到时钟错误。您的创建可能是不完整的
- android Intent的介绍
- C语言程序设计第9堂作业
- 7个碎片的excel重组实验
- 【不生气的智慧】王焕斌--书记
- 【自动驾驶】常见位姿估计算法的比较: 三角测量、PNP、ICP、
- 硬盘分区修复和碎片整理命令
- BTC源码分析 交易(一)
- Linux群组与文件权限
- 【计算机网络】DNS域名解析
- 你是我的四月天[转自天涯]
- == 和 equal
- 如何在Genymotion VM中安装Google Play服务(没有拖放支持)?
- 生成EXCEL(不使用模板)
- Angular ng-model指令详解
- 爬取去哪儿网旅游数据并且保存为csv文件
热门文章
- ROS vim退出快捷键
- 如何制作MiniTool数据恢复工具启动光盘或启动U盘?
- VM虚拟机开防检测 [ 游戏不能登录处理详解 ]
- STM32F103 NVIC嵌入式中断控制器
- openlayers官方教程(一)Introduction
- KMSpico_setup安装报病毒解决办法
- python将object转换为float_DataFrame中的object转换成float的方法
- 2015(第四届)中国信息化和工业化融合发展高峰论坛第二天-黄培博士讲座课件...
- 聋校计算机教学工作总结,2014年年上半年聋校七年级数学教学工作总结
- SI24R2E应用于2.4G有源RFID养老院方案