我需要稍后运行mail.php文件,而不是让用户在提交register.php时等待验证电子邮件发送。
所以我选择使用 at 命令在1分钟后在命令行中运行mail.php(在register.php中调用):
但是当我处于at命令的交互模式时,我只能将参数发送到该php文件。
at now + 1 minute
at> php mail.php {email} # {email} is the argument I want to pass
因为我希望这是自动的,所以我需要在运行shell脚本时使用:
at -f mail.sh
但我找不到合适的方法来传递 {email} 参数,
我尝试在Shell中设置一个可变的环境,但也是徒劳的:
在 register.php 文件中,我写道:
shell_exec('export email=foo@bar.com');
shell_exec('at -f mail.sh now + 1 minute');
在 mail.sh 中,我写道:
#! /bin/bash
php mail.php $email
答案 0 :(得分:8)
您可以使用:
shell_exec('echo php mail.php test@test.com | at now + 1 minute');
答案 1 :(得分:5)
您可以从stdin而不是从文件中读取命令。 (bash的)here-doc语法在这里很好用:
shell_exec('at now + 1 minute <<EOF
php mail.php test@test.com
EOF
');
答案 2 :(得分:0)
一气呵成:shell_exec('export email=foo@bar.com; at -f mail.sh now + 1 minute');
或只是:shell_exec('php mail.php foo@bar.com');
答案 3 :(得分:0)
1)对于Linux。检查文件
/etc/at.deny
删除用户“www-data”(如果存在)。
2)用php安排简单的命令。
Linux的
exec('echo "mkdir /tmp/testAT" | at now + 1 minute');
窗
exec('at "16:45:01 20.09.2017" cmd /c mkdir C:\Server\_debug\1\testAT');
3)安排Symfony框架命令。
exec('echo "php /var/www/mysite.com/app/console system:test_command param1 param2 --env=test" | at 11:14 AM 19.09.17');
答案 4 :(得分:0)
我知道最初的问题已得到令人满意的回答,但是如果您在PHP脚本中使用popen
来执行 at 命令,则可以包含以下参数(作为GET参数)这个:
$target_script_path = "path/to/your/target/script";
$time = "now";
$file = popen("/usr/bin/at $time", "w");
//$cmd = "/usr/bin/php $target_script_path"; // Working example with no arguments supplied.
//$cmd = "/usr/bin/php $target_script_path?test_param=test_value"; // Trying to use a GET parameter like this does not work!
$cmd = "/usr/bin/php $target_script_path test_param=test_value"; // Working example *with* argument!
fwrite($file, $cmd);
pclose($file);
然后,您可以使用以下命令在目标脚本中选取test_param
值:
$test_param = $_GET['test_param']; // "test_value"