我有一个php脚本创建一个shell脚本,该脚本在从同一个php文件创建后运行,shell脚本生成一个注册表文件,我需要在脚本执行后再次从同一个php中读取。 php读取文件,但我认为它是在文件填充或创建之前完成的,如果我回到浏览器并再次执行php,那么textarea就会有内容。我试图解决它添加sleep(),exit()函数和一些其他策略但没有成功。以下是我尝试过的一些事情:
// Creation of the shell script: Corpus alignment target to origin
......
$cmd = "cwb-align-encode -r $REGDIR -D $CORPUSLOCATION$corpusname/$corpusname"._."$lang_tg.align\n\n";
file_put_contents($scriptfile, $cmd, FILE_APPEND | LOCK_EX);
// Run the corpus indexation script
$cmd = "/bin/bash $scriptfile > /dev/null 2>&1 &";
shell_exec($cmd);
从同一个php中读取注册表文件:
// 1st try: no content at the textarea
echo "<textarea id='txtArea'>".htmlspecialchars(file_get_contents( $REGDIR.$corpusname ))."</textarea>";
// 2nd try: no content at the textarea
echo "<textarea id='txtArea'>".sleep(10); htmlspecialchars(file_get_contents( $REGDIR.$corpusname ))."</textarea>";
// 3rd try: no content at the textarea
echo "<textarea id='txtArea'>".exit(); htmlspecialchars(file_get_contents( $REGDIR.$corpusname ))."</textarea>";
// 4th try: no content at the textarea
echo "<textarea id='txtArea'>".if(filesize($REGDIR.$corpusname) != 0) { echo htmlspecialchars(file_get_contents( $REGDIR.$corpusname )); } else { exit(0); sleep(10); htmlspecialchars(file_get_contents( $REGDIR.$corpusname )); }."</textarea>";
答案 0 :(得分:1)
您正在使用的命令行创建了一个执行任务的新线程。 PHP不会等待它,因为你没有将strout引用到php(但是/ dev / null)
因此,通过更改命令,您可以使PHP等待,从而获得您期望的结果。
现在我不确定正确的命令是什么,但我会从
开始$cmd = "/bin/bash $scriptfile"
另请查看here。你想要与那个人想要的相反。但它确实提供了有关命令实际执行内容的更多信息。
答案 1 :(得分:0)
即使@Jeffrey给出的答案是对的,我也意识到如果shell脚本执行时间短,这个答案就足够了,否则你的php网页会过期或挂断,所以我再试一次另一个php函数:header('Refresh:x'),这使它工作正常!
所以这就是我现在得到的:
// Run the corpus indexation script
$cmd = "/bin/bash $scriptfile > /dev/null 2>&1 &";
shell_exec($cmd);
<textarea id="txtArea" rows="28"><?php if (filesize($REGDIR.$corpusname) != 0) { echo htmlspecialchars(file_get_contents( $REGDIR.$corpusname )); }
else { header('Refresh: 0.5'); htmlspecialchars(file_get_contents( $REGDIR.$corpusname ));} ?></textarea>
<强>更新强>
又一个解决方案:
do { echo htmlspecialchars(file_get_contents( $REGDIR.$corpusname )); } while (filesize($REGDIR.$corpusname) == 0);