如何持续运行PHP脚本?

4

简单描述:我正在编写PHP脚本,用于发送和接收短信。脚本将根据每个用户的注册日期计算每周发送用户活动短信,例如每周一上午10点向A先生发送短信,每周五晚上7点向B小姐发送短信。PHP脚本会处理所有必要的事情。

问题:很明显,一个非常有趣的方法是让某人每隔几秒钟刷新我的应用程序的主页面,以便能够继续计算和理解何时执行作业,或者始终在我的计算机上打开主页面,因此JavaScript和jQuery将处理其余部分!

我的问题:如何使我的PHP程序或脚本像唤醒一样而无需刷新或打开主页面?通过唤醒,我指的是它感知下一个计划并执行它等等。

一些初步想法:也许我可以使用Ajax或Curl每10秒钟调用主页面..但我不知道如何唤醒Ajax或Curl。

我看到一些互联网帖子建议使用命令行,无论是在Linux Unix还是Windows中..但我通常访问主机而不是命令行,对吗?还是命令行是主机中的某个东西,我不知道它,如果是,请帮助我..

重要例子:有PHP WP插件,如Total Cache和Supper Cache,似乎总是处于唤醒状态,并且不需要某人刷新页面。

请尽可能以PHP和PHP系列回答所有问题,我根本不懂Unix或那些编程..

------- 根据答案取得一些进展..现在我有以下脚本:

ignore_user_abort(true);
set_time_limit(0);
$data = file_get_contents('filename.txt');
$data = $data+1;
file_put_contents('filename.txt', $data);
$page = $_SERVER['PHP_SELF'];
$sec = "4";
header("Refresh: $sec; url=$page");

它能够正常工作!即使我重新启动本地主机。主要问题是当我关闭主页面时,它停止了在filename.txt中的递增,并且重新打开页面后,两个实例正在运行并且递增继续进行,那么:

  • 即使我关闭页面,它也应该继续递增吗?
  • 如何停止它?
  • 在后台运行多个页面实例是否正常?

最后:根据此页面上的说明,最好创建一个启动器或重新加载页面,然后使用命令来启动此重新加载页面,例如每1分钟,然后像平常一样编写PHP代码。

最后但同样重要的是:如何停止此后台脚本以进行更新或维护...


7
你可以尝试使用CRON。 - Jay Blanchard
2
使用crontab。创建多个cron作业,并通过传递参数在脚本上指定时间,类似于ajax.php?sms=seven和ajax.php?sms=ten。 - Rafael Shkembi
什么是CRON?它是否像PHP页面一样编写?再说,假设PHP计算短信发送时间为七点和十点,并将这些时间传递给CRON,对吗?那么CRON如何启动?它是否始终在正常的PHP服务器上运行? - Shahram Mohseni
2个回答

5
针对这个问题,已经发明了cron作业。Cron作业是定时作业,例如可以执行PHP脚本。
您可以设置一个cron作业来每小时检查哪个用户应该收到他/她的短信。根据您的操作系统,您可以设置这些cron作业。对于Linux发行版,有很多关于如何设置此类作业的指南。
来自维基百科

软件实用程序Cron是Unix类计算机操作系统中的基于时间的作业调度程序。设置和维护软件环境的人使用cron在固定的时间、日期或间隔周期性地安排作业(命令或shell脚本)运行。它通常自动化系统维护或管理,尽管它的通用性使其在诸如定期从互联网下载文件和电子邮件的情况下也很有用。 cron名称的起源来自希腊单词时间, χρόνος(chronos)。 (cron作者Ken Thompson已经在与Brian Kernighan的私人通信中证实了这一点。)

我添加了一个资源,解释了如何使用cron作业。
另一种方法是在后台运行一个PHP脚本:
// Keep executing even if you close your browser
ignore_user_abort(true);

// Execute for an unlimited timespan
set_time_limit(0);

// Loop infinitely
// If you create a file called stop.txt,
// The script will stop executing
while (!file_exists('stop.txt')) {
    // Retrieve user data and sens sms messages

    // Wait for an hour
    sleep(3600);
}

更新

ignore_user_abort(true);
set_time_limit(0);
$data = file_get_contents('filename.txt');
while (!file_exists('stop.txt')) {
    // Add 1 to $data
    $data = $data+1;
    // Update file
    file_put_contents('filename.txt', $data);

    // Wait 4 seconds
    sleep(4);
}

要停止执行,请创建一个名为stop.txt的文件。

资源


据我理解,如果我只访问页面一次,那么它将运行得像是打开了一样...非常重要的是,它是否支持后台模式下的jQuery> - Shahram Mohseni
不可以在后台支持jQuery,因为jQuery是客户端语言,无法在服务器上执行。 - Peter
长时间运行的PHP脚本容易出现故障,并需要自动恢复被杀死或挂起的方式。实现OP的目标的最佳方法是使用一个cron作业每1、5或多少分钟轮询一个脚本。该脚本应检查一个文件(或db值)的日期+时间。如果日期+时间≤当前时间,则应查找所有准备好的任务队列并执行任何一个。每当添加/删除/完成任务时,该日期+时间值应更新为队列中下一个最近的时间。这比每次搜索整个队列更有效率。 - Walf
Peter,我通过你的回答进一步提出了我的问题,请你在上面的主要问题下方检查一下。 - Shahram Mohseni
你可以通过点击我的答案左侧的按钮接受我的答案来感谢我。 - Peter

1
您可以在几乎所有服务器上创建cron作业,而无需访问命令提示符。
Cron作业可用于在指定间隔(如每分钟、每小时等)初始化cli中的php脚本。

请进行搜索。它在互联网上随处可见。 - Ima
1
https://www.cyberciti.biz/faq/how-do-i-add-jobs-to-cron-under-linux-or-unix-oses/ - Ima
你的托管合作伙伴是谁? - Ima
抱歉,我不太擅长用语言表达。如果您指的是网络托管,那么合作伙伴是bertina.us。如果您指的是短信网关,则为www.sms.ir。 - Shahram Mohseni

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