Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
防止php exec等待_Php_Ajax_Asynchronous_Exec - Fatal编程技术网

防止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 &");

我已经工作了一段时间,试图让一些php代码异步运行,我看到了各种帖子

我希望我的脚本运行一些额外的格式,但快速返回脚本,而不是等待exec命令响应。到目前为止,这是我的代码

//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,它也在保留一个进程


真正做到这一点的方法(离线处理)是一个基本的作业排队服务器——这个主题远远超出了本文的讨论范围

我将采用不同的方法:

  • 将数据库中的作业添加到作业队列中
  • 使用cron作业处理尚未处理的作业和未处理的作业;该脚本将从数据库中加载最早的未处理和未处理项,设置“正在处理”标志并同步运行作业
  • 作业完成后(使用与同步作业相同的脚本),将其标记为已处理并向所有者发送邮件

  • 您甚至可以对同一数据库进行页面检查,以获取用户的状态;在队列中,以最简单的形式进行处理和完成。

    说这是可能的:你为什么想要它?调用脚本时,您不知道它是否成功(因为您没有等待exec正常运行)Hi Barmar,因为我希望它在上传m4a文件后返回脚本返回,然后再处理其他两种格式。等待所有格式转换的时间太长。ajax请求timesoutHi Ray,你能解释一下我如何将EXEC粘贴到对象的解构器中吗。因为这正是我想要的,我也需要回应用户,我不需要用户的回应exec@user1503606如果您不需要exec的任何响应,只需将命令包装在parentesis中,并在末尾添加一个&即可。但是如果你有一个对象,就像_construct()方法一样,有一个_destruct()当对象从内存中释放出来时会调用它,通常是在响应后调用。好的,谢谢你,ray,我会看看我是否能弄清楚,如果不能,我只能接受3个ajax调用,每个调用都有回调file@user1503606我添加了一个使用析构函数方法的简单示例。你可以设置一个ajax轮询,看看这项工作是否完成了。嗨,杰伦,你知道关于如何完成上述工作或从哪里开始的简单教程吗?因为上述过程对你来说根本不起作用me@user1503606不,我从来没有真正找过。如果您在任何步骤遇到问题,您都应该发布详细的问题。