您的位置:首页 > 编程语言 > PHP开发

php实现异步操作

2012-07-10 16:25 555 查看
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/bash

task_id=$1
cd /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);


这样的话,用户提交完后,当前进程不会被占用,用户就可以干其他事,用户体验得到了提升。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php 数据库 fp 文档 url ajax