在php中发送通知的后台脚本


Background script to send notifications in php

我有一个需要向数据库中的所有用户发送通知的代码

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导航其他东西?我从一个表单运行这段代码。

在php脚本的顶部使用以下代码:

set_time_limit(0);
ignore_user_abort(true);

以上代码确保,即使您关闭了browser/ssh session,脚本也会运行,直到它完成或web服务器服务重新启动。


set_time_limit

设置脚本允许运行的秒数。如果这是到达后,脚本返回一个致命错误。默认限制为30方法中定义的max_execution_time值. ini。

调用时,set_time_limit()从零重新启动超时计数器。换句话说,如果超时是默认的30秒,而25在脚本执行几秒钟后,调用set_time_limit(20)设置完成后,脚本将在超时前运行45秒。

ignore_user_abort

设置客户端断开连接是否会导致脚本终止。

当PHP作为命令行脚本运行时,脚本的tty显示在没有终止脚本的情况下离开,那么脚本将在下次它尝试写入任何东西时,除非value被设置为TRUE


也许您可以从命令行运行php。因此,正常页面启动一个新进程,该进程将实际发送通知。

http://php.net/manual/en/features.commandline.php

虽然这里建议的其他解决方案可能有效,但随着用户群越来越大,您最终会遇到"缩放"问题。

在这些情况下,建议的方法是将所需的功能移动到"队列"中进行后台处理。这样它就不会占用主应用程序线程/服务器进程。(更多关于"消息队列"在这里:https://en.wikipedia.org/wiki/Message_queue)

使用队列意味着您将需要处理的小有效负载(消息)发送到缓冲区,该缓冲区由队列服务维护。然后"工作者"(即单个进程)接收这些消息并处理任何需要处理的内容。完成单个处理工作后,将从队列中删除消息。这种类型的实现允许您添加越来越多的工作者来加速队列中所有消息的整体处理。

如果您使用AWS,您可以查看SQS(简单队列服务)https://aws.amazon.com/sqs/

其他开源的替代方案是RabbitMQ, Gearman或ZeroMQ

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();">

**add to PHP **

$users = $_POST['user'];
$message = $_POST['message'];