我有几个由cron运行的PHP文件。我使用命令 -
设置了cronscrontab crontab.txt
在crontab.txt文件中,我编写了这样的cron命令: -
#(Updating tutor activities) - every minute
* * * * * /usr/bin/wget -O - -q -t 1 http://project/cron/tutor_activities.php
但是没有任何功能正常工作(数据库查询,发送提醒邮件等)。手动运行URL有效。
然后我将我的邮件地址放在MAILTO
并收到邮件。在邮件中,我收到了该页面的整个HTML源代码。邮件的期望是什么?为什么我的功能不起作用?
更新
如果我将我的cron命令改为
#(Updating tutor activities) - every minute
* * * * * /usr/bin/wget http://project/cron/tutor_activities.php
仍然没有成功,这来自我的邮件 -
--15:03:01-- http://project/cron/tutor_activities.php
=> `tutor_activities.php'
Resolving project... IP Address
Connecting to test.project|IP Address|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://project./ [following]
--15:03:01-- http://project./
=> `index.html.1'
Resolving project.... IP Address
Connecting to project.|IP Address|:80... connected.
HTTP request sent, awaiting response... 302 Found
Location: http://project/home/ [following]
--15:03:01-- http://project/home/
=> `index.html.1'
Resolving project... IP Address
Connecting to wproject|IP Address|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
index.html.1 has sprung into existence.
Retrying.
许多index.html.1
,index.html.2
文件正在我项目的根目录中累积。我不希望创建这些文件。只想让文件执行。
如果我使用两个命令中的任何一个,那么结果相同 -
* * * * * /usr/bin/wget http://project/cron/tutor_activities.php
* * * * * wget http://project/cron/tutor_activities.php
使用php
set运行MAILTO
命令发送给我错误/ bin / sh:php:命令未找到。
* * * * * php /path/to/test.php
所以,我无法使用php
命令。
我在test.php中写了一个简单的mailto()
。通过cron运行时不会发送邮件(同时使用wget
和php
失败),但手动运行URL会有效。
我的问题
为了再次说清楚,我的主要问题是cron文件中的功能没有运行。创建文件是次要问题。
任何帮助将不胜感激
谢谢,
Sandeepan
答案 0 :(得分:7)
如果您想将网址称为cronjob,则必须使用wget之类的内容。如果它是您服务器上的php脚本,那么使用php /...pathtomyscript.../cron/tutor_activities.php
答案 1 :(得分:7)
尝试
哪个php
返回的路径应该放在运行Cron文件的命令中。如果你通过Shell设置Cron,它不会给出任何问题,但要确保,请尝试给出绝对路径当你试图运行一个php页面时。
/ path / to / php / path / to / cron / script /
如果问题仍然存在,请尽量给你这样的命令;随意讨论。
答案 2 :(得分:1)
当你用 -O - 调用wget时,它会将下载的内容发送到stdout,cron通过电子邮件发送给你。在第一种情况下,它正在做它应该做的事情。
当您使用 -O 参数调用wget时,它会尝试将下载的内容保存为与正在下载的网页同名的文件。如果存在,它会将增量符添加到名称中,如您所见。在第二种情况下,它正在做它应该做的事情。
从您的问题中不清楚您希望输出的位置,但如果您想每次将输出保存到同一文件,请使用 -O myfilename.html 。
答案 3 :(得分:1)
如果从cron /命令行运行PHP,请确保将完整路径放到php可执行文件
答案 4 :(得分:1)
完全有可能PHP不在cron环境中的路径中 - 它肯定不会与常规shell具有相同的设置。尝试使用绝对路径来完成php解释器和cron命令中的php脚本:
* * * * * /path/to/php /path/to/test.php
至于文件的创建,您只需要在wget命令中添加重定向:
wget -O - ... http://.... > /dev/null
-O -
强制wget将其下载的任何内容写入标准输出,然后cron会愉快地通过电子邮件发送给您。通过在命令末尾添加> /dev/null
,此输出将改为Sky中的Great Bitbucket。如果你不想通过电子邮件发送wget的stderr输出,你也可以在2&>1
之后添加/dev/null
,这会进一步将stderr重定向到stdout,现在转到/dev/null.
答案 5 :(得分:1)
我自己发现了这个问题。我没有在我手动运行的crontab文件中放入相同的URL,这是我的错误。
手动运行时,我只是在URL中键入test,我的浏览器保存的URL列表出现了,我选择了URL http://www.test.project.com/cron/tutor_activities.php
,但在crontab文件中我放了http://test.project.com/cron/tutor_activities.php
。我错误地认为这会运行http://www.test.project.com/cron/tutor_activities.php
(因为我们有一个重写规则可以添加www
)
但重写规则是将其重定向到http://www.test.project.com/home
。这就是邮件中HTML内容的原因。
所以,这里要学到的最重要的事情是确保我们不会错过细微之处并且不要认为我们做的一切都是正确的。在我的情况下,最好将工作URL复制粘贴到cron文件中。
答案 6 :(得分:0)
一种简单安全(无tmp文件)的方法是使用bash的进程替换:
* * * * * bash -c "/path/to/php <(/usr/bin/wget -O - -q -t 1 http://project/cron/tutor_activities.php)"
进程替换在<()
内运行命令,并将输出放入一个只能从当前进程中看到的文件对象。为了从cron中使用它,直接调用bash并将其作为命令字符串传递。
正如其他人所提到的那样,使用php的完整路径,您可以使用which php
找到它。