我有以下脚本update_pos_
databases.php(简化版)
<?php
ini_set('display_errors', 1);
set_time_limit(0);
$db_host = 'localhost';
$db_user = 'root';
$db_password = 'PASSWORD';
$databases = array('example');
$db_host = escapeshellarg($db_host);
$db_user = escapeshellarg($db_user);
$db_password = escapeshellarg($db_password);
foreach($databases as $database)
{
echo "Running queries on $database\n***********************************\n";
system("mysql --host=$db_host --user=$db_user --password=$db_password -v -v -v $database < ../update.sql");
echo "\n\n";
}
?>
当我调用它时,我会执行以下操作:
nohup php update_pos_databases.php > results.txt 2>&1 </dev/null &
由于我在php脚本中使用system命令是否有任何问题,如果使用上述命令导致其中一个系统命令由于某种原因失败?我觉得我在做的很好;但在我部署此更改之前,我想知道在使用nohup调用的脚本中使用system()的任何危险. (我不希望脚本因某些随机原因而死).
上面脚本中的单个系统命令也会被阻塞吗?我想确保它们一个接一个地运行,而不是同时运行.
最佳答案 即使终端断开(例如,注销)和&将把这个过程放在后台.是的,每个系统都会在迭代到下一个循环之前运行完成:php不知道它正在运行no-hupped.
以下是显示这些行为的简化示例:
$cat demo.php
<?php foreach (range(1,10) as $i) system("/bin/date && /bin/sleep $i");
# run it without nohup, then simulate a logout
$php demo.php > results.txt 2>&1 </dev/null &
$kill -HUP $!
$cat results.txt
Tue Sep 8 12:27:20 EDT 2015
Tue Sep 8 12:27:21 EDT 2015
[1]+ Hangup php demo.php > results.txt 2>&1 < /dev/null
$# do it again, this time with nohup
$nohup php demo.php > results.txt 2>&1 </dev/null &
$kill -HUP $! # no effect
$cat results.txt
Tue Sep 8 12:08:56 EDT 2015
Tue Sep 8 12:28:28 EDT 2015
Tue Sep 8 12:28:29 EDT 2015
Tue Sep 8 12:28:31 EDT 2015
Tue Sep 8 12:28:34 EDT 2015
Tue Sep 8 12:28:38 EDT 2015
因此,您的脚本似乎是按照您的预期编写的.我建议的唯一修改是在系统语句中放置MySQL命令行可执行文件的完整路径.