防止php exec等待
我已经工作了一段时间,试图让一些php代码异步运行,我看到了各种帖子 我希望我的脚本运行一些额外的格式,但快速返回脚本,而不是等待exec命令响应。到目前为止,这是我的代码防止php exec等待,php,ajax,asynchronous,exec,Php,Ajax,Asynchronous,Exec,我已经工作了一段时间,试图让一些php代码异步运行,我看到了各种帖子 我希望我的脚本运行一些额外的格式,但快速返回脚本,而不是等待exec命令响应。到目前为止,这是我的代码 //convert ogg exec("cd {$targetDir}/ && ffmpeg -i {$tmpname}.wav -c:a libvorbis out.ogg > /dev/null 2>/dev/null &");
//convert ogg
exec("cd {$targetDir}/ && ffmpeg -i {$tmpname}.wav -c:a libvorbis out.ogg > /dev/null 2>/dev/null &");
//convert mp3
exec("cd {$targetDir}/ && ffmpeg -i {$tmpname}.wav out.mp3 > /dev/null 2>/dev/null &");
return ajax response
有人能告诉我这是否是可能的并且可以做到的吗问题是,在使用
&
进行后台处理之前,您正在运行多个链接在一起的不同命令
将整个命令插入()
,然后添加&
exec("(cd {$targetDir}/ && ffmpeg -i {$tmpname}.wav -c:a libvorbis out.ogg > /dev/null 2>/dev/null ) &");
exec("(cd {$targetDir}/ && ffmpeg -i {$tmpname}.wav out.mp3 > /dev/null 2>/dev/null ) &");
如果您需要exec的返回值,但不想在响应用户之前等待它,您可以始终将exec粘贴到对象的解构器中。。。考虑到一个穷人的工作队列:
下面是一个示例,如果您需要对exec结果执行某些操作
class Foo(){
public function __destruct(){
//These exec's won't be backrounded, but this method is only call after the object is
// is being garbage collected, so the user's not waiting on the results
exec("cd {$targetDir}/ && ffmpeg -i {$tmpname}.wav -c:a libvorbis out.ogg > /dev/null 2>/dev/null ");
exec("cd {$targetDir}/ && ffmpeg -i {$tmpname}.wav out.mp3 > /dev/null 2>/dev/null ");
//exec's are done, now do anything else you want here...
}
}
这种方法的一个警告是,即使客户机已经移动,进程仍然在运行,消耗内存,如果使用php fpm,它也在保留一个进程
真正做到这一点的方法(离线处理)是一个基本的作业排队服务器——这个主题远远超出了本文的讨论范围我将采用不同的方法:
您甚至可以对同一数据库进行页面检查,以获取用户的状态;在队列中,以最简单的形式进行处理和完成。说这是可能的:你为什么想要它?调用脚本时,您不知道它是否成功(因为您没有等待exec正常运行)Hi Barmar,因为我希望它在上传m4a文件后返回脚本返回,然后再处理其他两种格式。等待所有格式转换的时间太长。ajax请求timesoutHi Ray,你能解释一下我如何将EXEC粘贴到对象的解构器中吗。因为这正是我想要的,我也需要回应用户,我不需要用户的回应exec@user1503606如果您不需要exec的任何响应,只需将命令包装在parentesis中,并在末尾添加一个&即可。但是如果你有一个对象,就像_construct()方法一样,有一个_destruct()当对象从内存中释放出来时会调用它,通常是在响应后调用。好的,谢谢你,ray,我会看看我是否能弄清楚,如果不能,我只能接受3个ajax调用,每个调用都有回调file@user1503606我添加了一个使用析构函数方法的简单示例。你可以设置一个ajax轮询,看看这项工作是否完成了。嗨,杰伦,你知道关于如何完成上述工作或从哪里开始的简单教程吗?因为上述过程对你来说根本不起作用me@user1503606不,我从来没有真正找过。如果您在任何步骤遇到问题,您都应该发布详细的问题。