php实现异步操作

来源:互联网 发布:mysql.createpool 编辑:程序博客网 时间:2024/06/06 12:26
1. 问题:

要实现类似百度文库的效果,上传的文档全部要进行转换,包括缩略图,这些比较费时间,用户上传提交后不能让用户等待时间过长。用户提交后用户可以干别的事,后台一个程序来处理就可以了,最后数据自动插入到数据库中,当然用户等待的时间是越短越好,所有如果用定时器来执行保存到数据库的任务,那等待时间肯定会提高。所以用户提交后需要立即启动后台程序执行。

2.  尝试过的方法:

 ajax 提交数据到 php ,然后php 通过fsockopen 的方式启用另一个php 来进行文档转换。问题是用户提交后页面一直不能动,

说明该进程处于被占用状态。和用ajax提交然后等待处理完成的效果是一样的,用户体验不好。

$url_array = parse_url($url);$host = $url_array["host"];$path = $url_array["path"];$geturl = $path."?task_id=".$task_id;$fp = fsockopen($host , 80, $errno, $errstr, 30);if (!$fp) {    echo "$errstr ($errno)<br />\n";} else {    $out = "GET $geturl HTTP/1.1\r\n";    $out .= "Host: $host\r\n";    $out .= "Connection: Close\r\n\r\n";    fwrite($fp, $out);    while (!feof($fp)) {        echo fgets($fp, 128);    }    fclose($fp);}

3.  解决方法:

(1)考虑到用户提交的参数比较多   php间异步通讯时不方便  如果文档转换失败 也没有记录,所以对用户的请求进行数据库保存,包括提交的参数。

(2) 创建一个php A.php 来进行文档转换并保存到数据库(要先从任务表中查到一些参数)。


(3) 创建一个脚本文件  B.sh ,来执行 A.php

#!/bin/bashtask_id=$1cd /usr/local/nginx/html/usr/local/php/bin/php /usr/local/nginx/html/A.php $task_id

(4)最后在用户请求的php 中调用脚本

$cmd = "/usr/local/nginx/html/B.sh"." ".$task_id." > /dev/null &";exec($cmd);

这样的话,用户提交完后,当前进程不会被占用,用户就可以干其他事,用户体验得到了提升。



原创粉丝点击