用 .bat 文件运行 PHP 脚本

10

我需要在每天午夜在我的服务器上运行一个php脚本。在Linux系统中,我会设置cron job,但现在我只能使用Windows系统。

我知道我需要使用Windows任务计划程序设置任务,并且该任务将需要运行一个.bat文件,而.bat文件将运行php文件,但我无法编写.bat文件。

目前我拥有的是:

@echo off
REM this command runs the nightly cron job
start "C:\Program Files (x86)\PHP\v5.3\php.exe" -f C:\inetpub\wwwroot\sitename\crons\reminder-email.php

但是当我尝试手动运行.bat文件进行测试时,我得到一个Windows警告,上面写着:

"Windows找不到“-f”。请确保你输入的名称正确,然后重试。

我错过了什么?

6个回答

9
START "Placeholder Title" "C:\Program Files (x86)\PHP\v5.3\php.exe" -f < p > START 命令可选地接受一个标题作为创建窗口的第一个参数; 在这种情况下,它认为 C:\Program Files (x86)\PHP\v5.3\php.exe 是要显示的标题,并且 -f (第二个参数)是要运行的可执行文件。因此,您可以通过提供一个占位符标题来修复这个问题,例如:

START "Placeholder Title" "C:\Program Files (x86)\PHP\v5.3\php.exe" -f
start "email reminder task" "C:\Program Files (x86)\PHP\v5.3\php.exe" -f C:\inetpub\wwwroot\sitename\crons\reminder-email.php

或者更好的方式是,您可以完全放弃使用 START 命令(因为您没有使用其独特的功能),直接运行 PHP:
"C:\Program Files (x86)\PHP\v5.3\php.exe" -f C:\inetpub\wwwroot\sitename\crons\reminder-email.php

只有一个问题,批处理不会等到脚本结束。 - a77icu5
@a77icu5:在问题的上下文中,这不是一个问题,而且只有在使用“START”时才会发生(直接调用会等待PHP执行结束)。即使使用“START”,您也可以使用“/WAIT”来匹配直接调用行为。 - Jon
1
如何让命令行窗口保持打开状态?假设我正在无限期地运行一个用于Web套接字的脚本。 - AFwcxx

7
实际上,您甚至不需要批处理文件。您可以从任务计划程序中运行php脚本。只需让任务计划程序运行php.exe,并将php文件的位置设置为任务的参数即可。

运行得非常完美。答案也很显而易见。不确定为什么我一开始就没有尝试这个! - Bob Nocraz
运行完美。好主意! - Mr Rubix

3

我能建议一个小修改吗。

这段文字涉及IT技术相关内容。
echo off
REM This adds the folder containing php.exe to the path
PATH=%PATH%;C:\Program Files (x86)\PHP\v5.3

REM Change Directory to the folder containing your script
CD C:\inetpub\wwwroot\sitename\crons

REM Execute
php reminder-email.php

PS. 将Apache、MySQL或PHP放在Program Files中是不好的做法。不要使用名称中带有空格的Windows文件夹。


我不确定为什么有人会选择以这种方式做事。例如,为什么要CD到cron脚本目录?为什么要将某些内容添加到PATH中,而不是在命令行中直接指定路径?最后,将东西放在Program Files中有什么问题吗?我已经这样做了很多年了;只要在需要时正确引用目录名称,当然一切都可以正常工作。 - Jon
我正在使用一个预先存在的系统,所以文件结构不在我的掌控之中。 - evilscary

2
这个怎么样?
set php="C:\Program Files (x86)\PHP\v5.3\php.exe"
%php% -f C:\inetpub\wwwroot\sitename\crons\reminder-email.php

1
很遗憾,这个问题花了近10个小时才解决。一些协议(如WinRM和PSEXEC)必须传递已登录的用户帐户,而不管提供的凭据是什么(或者PHP会覆盖你输入的任何内容)。无论如何,要获取PSEXEC、WinRM或只是启动连接到远程计算机的批处理文件,您需要将IIS运行帐户更改为具有访问这些资源的用户(服务帐户)。我意识到这是一个巨大的安全漏洞,但这是设计上的。PHP是安全的,因此不能轻易被黑客攻击,您必须通过指定运行帐户来覆盖它们的安全性。这与您的应用程序池帐户不同,尽管您的IIS凭据可以使用您的应用程序池帐户。

0

大家可以试试这样做!

cd E:\xampp\htdocs\my-project
E:
php artisan schedule:run

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接