我有这种情况:
用户提交指向我的 PHP 网站的链接并关闭浏览器。既然服务器已经获得了链接,它将分析提交的链接(页面)以查找损坏的链接,并且在完全分析了发布的链接之后,它将向用户发送一封电子邮件。我对第二部分有完整的了解,即如何分析页面中的断开链接并将邮件发送给用户。我唯一的问题是我如何才能实现这第一部分,即即使客户端没有请求,也让服务器继续运行它自己的操作?
我了解到“Crontab”或“fork”可能对我有用。你对这些有什么看法?使用这些可以实现我想要的吗?有哪些替代方案?
crontab 将是这样的方式。
本质上,您有两个应用程序:
cron
,它检查数据库中的记录并执行分析,完成时发送结果通知。这两个应用程序共享同一个数据库,但在其他方面相互忽略。
网站本身并不适合这种离线工作,它主要是一个请求/响应系统。但是计划任务适用于此。除非用户期望立即响应,否则等待离线任务的下一次计划运行的小延迟是可以的。
服务器应该独立于浏览器运行脚本。一旦请求提交,php服务器运行脚本并将结果返回给浏览器(如果有结果要返回)
另一种方法是将请求添加到数据库,然后使用 crontab 在给定的时间间隔运行 php 脚本。然后该脚本将检查数据库以查看是否有任何需要处理的内容。您可以限制脚本每分钟运行一个数据库条目(或任何工作)。如果您一次有很多请求,这将有助于防止出现性能问题,但发送电子邮件会变慢。
一种典型的方法是在用户提交链接时将链接输入数据库。然后,您将使用 cron 作业定期执行脚本,该脚本将处理任何挂起的链接。
具体如何设置 cron 作业(或等效的计划任务)取决于您的服务器。如果您的主机提供基于 Web 的管理工具(例如 CPanel),通常会有一种方法可以在其中进行操作。
客户端关闭broser(终止连接)后,PHP脚本将继续运行。
只记住 PHP 脚本的最大执行时间限制为“max_execution_time”指令值。
当然在这里我想链接提交发生在调用你的脚本页面......我不明白这是否是你的用例......
为了简单起见,cronjob 可以创造奇迹。用户提交一个链接,Web 处理程序只是将链接保存到数据库中(让我在这里假设该表名为“queued_links”)。然后计划每分钟运行一次 cronjob(例如),选择每个link
from queued_links
,执行应用程序逻辑(查找损坏的页面链接)并发送电子邮件。然后它还删除链接queued_links
(或更新标志以表示link
已处理的事实。
出于规模和速度的考虑,cronjob 不如 Message Queue 适合(参见 rabbitmq、activemq、gearman 和 beanstalkd(gearman 和 beanstalk 是我最喜欢的 2,简单且非常适合 php))。代替每分钟生成一个 cronjob,队列处理器侦听“事件”并异步处理“事件”(想想“onLinkSubmission($link)”),并尽快处理消息。cronjob 解决方案只是这些 MQ 解决方案之一的简化实现,将产生更好/更可预测的结果,但代价是添加新服务来维护等。
好吧,有几种方法,最简单的方法是:当用户提交请求时,将此请求保存在某个位置,我们称之为工作表,并通知客户他的请求已收到,他们将被更新站点完成处理你的要求,或任何适合你的东西。
现在,创建一个(或多个)脚本(取决于要求)并从 Cron 运行这个脚本,这个脚本将从 Job 表中挑选请求,处理它,做任何需要的事情。
或者,您可以评估 message_queue 的可能性,或者可能为此使用作业服务器。
所以,这一切都取决于你的要求。