我有一个代码需要向数据库中的所有用户发送通知
function sendPushNotificationToUsers($users, $message)
{
$iPhoneUsers = array();
$androidUsers = array();
foreach ($users as $user)
{
if($user['deviceType'] == "iPhone")
$iPhoneUsers[] = $user;
else if($user['deviceType'] == "Android")
$androidUsers[] = $user;
}
sendApplePushNotifications($iPhoneUsers, $message);
//sendGooglePushNotifications($androidUsers, $message);
return true;
}
通常需要2-3个小时。我如何在一个可以在后台运行的脚本中运行此代码,而我在php中导航其他东西?我从表单中运行此代码。
答案 0 :(得分:2)
在php脚本的顶部使用以下内容:
set_time_limit(0);
ignore_user_abort(true);
上述代码确保即使您关闭browser/ssh session
,脚本也会一直运行,直到完成或重新启动Web服务器服务。
设置允许脚本运行的秒数。如果是这样的话 到达后,脚本返回致命错误。默认限制为30 秒,或者,如果存在,则定义的max_execution_time值 php.ini中。
调用时,set_time_limit()从零重新启动超时计数器。 换句话说,如果超时是默认的30秒,那么25 在脚本执行的几秒钟内,调用如set_time_limit(20) 制作完成后,脚本将在超时前运行45秒。
设置客户端断开连接是否会导致脚本中止。
当运行PHP作为命令行脚本时,脚本的tty会运行 没有脚本被终止然后脚本将死亡 下次尝试写入任何内容时,除非将值设置为TRUE
答案 1 :(得分:0)
也许你可以从命令行运行你的php。因此,普通页面会启动一个实际发送通知的新进程。
答案 2 :(得分:0)
虽然此处提出的其他解决方案可行,但随着您的用户群越来越大,您最终会遇到“缩放”问题。
在这些情况下,建议的方法是将所需的功能移动到“队列”以进行后台处理。这样它就不会保存主应用程序线程/服务器进程。 (更多关于“消息队列”的信息:https://en.wikipedia.org/wiki/Message_queue)
使用队列意味着您需要将需要处理(消息)的小型有效负载发送到缓冲区,该缓冲区由队列服务维护。然后,“工人”,即个人流程,接受这些消息并处理需要处理的任何内容。完成单个处理工作后,将删除队列的消息。 这种类型的实现允许您添加越来越多的工作人员来加速队列中所有消息的整体处理。
如果您正在使用AWS,您可以查看SQS(简单队列服务)https://aws.amazon.com/sqs/
其他开源替代品是RabbitMQ,Gearman或ZeroMQ
答案 3 :(得分:0)
<强>的javascript 强>
<script language="javascript">
function checking()
{
var user=document.getElementById("user").value;
var message=document.getElementById("message").value;
$.ajax({
type: "POST",cache: false,
url: "url_to_php_file",
data: "user="+user+"&message="+message,
success: function(data) {
if(data==true)
{
//do simting
}else {
//do simting
}
});
}}
</script>
<强>形式强>
<input type="text" id="user" name="user" value="">
<input type="text" id="message" name="message" value="">
<input type="submit" value="Submit" onclick="checking();">
**添加到PHP **
$users = $_POST['user'];
$message = $_POST['message'];