Jas*_*ank 6 javascript php ajax bash
我正在编写一个PHP脚本的网页,用于接受以前上传到服务器的JFFS2图像的文件名.然后脚本将使用映像重新刷新服务器上的分区,并输出结果.我一直在用这个:
$tmp = shell_exec("update_flash -v " . $filename . " 4 2>&1");
echo '<h3>' . $tmp . '</h3>';
echo verifyResults($tmp);
Run Code Online (Sandbox Code Playgroud)
(该verifyResults函数将返回一些HTML指示给用户的更新命令是否已成功完成.即,在的情况下更新成功完成,则显示一条按钮重启装置等)
这样做的问题是更新命令需要几分钟才能完成,并且PHP脚本会阻塞,直到shell命令完成后再返回任何输出.通常,这意味着更新命令将继续运行,而用户将看到一个HTTP 504错误(在最坏的情况),或者等待网页加载几分钟.
我正在考虑做这样的事情:
shell_exec("rm /tmp/output.txt");
shell_exec("update_flash -v " . $filename . " 4 2>&1 >> /tmp/output.txt &");
echo '<div id="output"></div>';
echo '<div id="results"></div>';
Run Code Online (Sandbox Code Playgroud)
这理论上会将命令放在后台并将所有输出附加到/tmp/output.txt.
然后,在JavaScript函数,我会定期要求getOutput.php,这会简单地打印/tmp/output.txt的内容,并将其贴到"输出"分区.命令完成后,另一个Javascript函数将处理输出并在"results"div中显示结果.
但我在这里看到的问题是getOutput.php最终会在更新设备的闪存期间无法访问,因为它位于更新目标分区上.所以这可能会让我处于和以前一样的位置,尽管没有504或看似永远加载的页面.
我可以将getOutput.php移动到设备中的另一个分区,但是我认为我仍然需要使用webserver配置做一些时髦的东西才能在那里访问它(从webroot到它的符号链接,就像任何其他文件,最终在重新刷新期间被覆盖).
有没有其他方法在运行时显示命令的输出,或者我应该只使用我的解决方案?
编辑1:我正在测试一些解决方案.我稍后会用结果更新我的问题.
编辑2:似乎文件系统没有像我原先想象的那样被覆盖.相反,系统似乎以只读模式挂载现有文件系统,因此即使重新刷新文件系统,我仍然可以访问getOutput.php.
我在我的问题中描述的第二个解决方案似乎与使用popen(如下面的答案中提到)而不是shell_exec一起工作.页面加载,通过Ajax,我可以显示output.txt的内容.
但是,似乎output.txt没有实时反映re-flash命令的输出 - 在update命令从执行返回之前似乎没有显示任何内容.我需要做进一步的测试,看看这里发生了什么.
编辑3:没关系,我访问它时看起来文件是最新的.当我使用存储源JFFS2映像的分区触发内核执行一些与JFFS2相关的任务时,我只是遇到了延迟.我不知道为什么,但这显然导致所有PHP脚本都阻塞,直到它完成.
为了解决这个问题,我将把更新命令调用放在一个单独的脚本中并通过Ajax请求它 - 这样,用户至少会收到一些预先打包的反馈,而技术上仍在等待系统.
归档时间: |
|
查看次数: |
9102 次 |
最近记录: |