5

我需要稍后运行 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
4

5 回答 5

8

你可以使用这个:

shell_exec('echo php mail.php test@test.com | at now + 1 minute');
于 2013-11-14T14:34:15.100 回答
5

您可以从标准输入而不是从文件中读取命令。(bash 的)here-doc 语法在这里很好用:

shell_exec('at now + 1 minute <<EOF
    php mail.php test@test.com
EOF
');
于 2013-11-14T14:35:16.060 回答
0

一气呵成:shell_exec('export email=foo@bar.com; at -f mail.sh now + 1 minute');

要不就:shell_exec('php mail.php foo@bar.com');

于 2013-11-14T14:29:53.743 回答
0

我知道原始问题已得到令人满意的回答,但如果您popen在 PHP 脚本中使用来执行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"
于 2019-01-31T18:03:24.233 回答
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');
于 2017-09-20T07:38:07.750 回答