Php 在后台执行脚本

Php 在后台执行脚本,php,mysql,ajax,curl,phpmailer,Php,Mysql,Ajax,Curl,Phpmailer,我一直试图处理的代码有一个小问题。在我的项目中,我尝试在不同的时间使用php发送邮件,其中大多数是由用户触发的。因为有不同的邮寄点和页面,所以我创建了一个单一的邮寄脚本,在该脚本中我将所有邮寄请求发送到(这样,所有电子邮件都从一个页面发送) 例如,注册后,来自注册脚本的验证代码被发送到邮件脚本,邮件脚本向用户发送验证电子邮件。然后,注册脚本等待邮件脚本的响应,然后再重定向到下一页。但是由于很多因素,邮件脚本需要一些时间才能加载 我不希望用户经历这种延迟,因此我一直在寻找一种方法,在后台将数据发送

我一直试图处理的代码有一个小问题。在我的项目中,我尝试在不同的时间使用php发送邮件,其中大多数是由用户触发的。因为有不同的邮寄点和页面,所以我创建了一个单一的邮寄脚本,在该脚本中我将所有邮寄请求发送到(这样,所有电子邮件都从一个页面发送)

例如,注册后,来自注册脚本的验证代码被发送到邮件脚本,邮件脚本向用户发送验证电子邮件。然后,注册脚本等待邮件脚本的响应,然后再重定向到下一页。但是由于很多因素,邮件脚本需要一些时间才能加载

我不希望用户经历这种延迟,因此我一直在寻找一种方法,在后台将数据发送到邮件脚本,同时用户被重定向到另一个页面,而不是等待邮件脚本的响应

我曾尝试使用AJAX直接从前端发送数据,但我使用了一个验证过程,其中某些值通过了数据库的身份验证,因此我必须从注册脚本发送。我一直在寻找用于AJAX的php等价物,在重定向用户之前,我不必等待邮件脚本的响应。我试过卷曲,但不知怎的,它仍然在等待响应

这是我的cURL代码:

$url = "https://requiredurl";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPGET, 1);
$data = curl_exec($ch);
curl_close($ch);
header("location: returnurl");      
exit();
我希望它在执行cURL命令后立即重定向到重定向url,而不等待响应

我需要任何其他php方法的帮助,我可以用它来工作。提前感谢。

您可以使用screen命令 使用
sudo apt安装屏幕安装它
运行
屏幕
并按空格键并执行脚本后,现在可以关闭终端。 如果需要返回或查看屏幕,请运行
screen-ls
,如下所示:

$ screen -ls
There is a screen on:
        17216.pts-2.localhost   (Detached)
1 Socket in /path/to/home/.screen.

例如,要恢复屏幕,请运行
screen-r 17216

如果您确实通过注册脚本收集用户信息,我认为使用GET方法并不安全。您应该使用POST方法:

$postData = array(
    "data1" => "Test Data1",
    "data2" => "Test Data2",
    "data3" => "Test Data3"
);

$url = "https://requiredurl";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_exec($ch);
但如果你决定继续,可能对你有效的方法是删除
curl\u setopt($ch,CURLOPT\u RETURNTRANSFER,1)或者您可以轻松地将其注释掉。这样,命令将运行,但cURL不会发回或显示任何响应

这是不可取的,因为您不知道该命令是否运行,但它至少可以解决您的问题

另一种方法

将添加以下代码:

// don't let user kill the script by hitting the stop button
ignore_user_abort(true);

// don't let the script time out
set_time_limit(0);

// start output buffering
ob_start();  

// If you need to return data to the browser, run that code
// here. For example, you can process the credit card and
// then tell the user that their account has been approved. 

usleep(1500000); // delay before redirecting user

// now force PHP to output to the browser...
$size = ob_get_length();
header("Content-Length: $size");
header('Connection: close');
ob_end_flush();
ob_flush();
flush(); 
// everything after this will be executed in the background.
// the user can leave the page, hit the stop button, whatever.
usleep(2000000); // delay before executing background code
在邮件功能行之前

这样,当用户被重定向到另一个页面时,代码将在后台执行


我希望这会有所帮助

我建议使用异步工具,如。尝试使用cronjob或使用类似于supervisor的工具。听起来您可能会在市场上学习如何使用队列,如使用redis或Beanstalk。将请求从一端推入队列,并有一个作业在请求可用时将其拉出。这意味着您的脚本不必等待太多结果。等待电子邮件发送通常表明您没有使用SMTP发送到本地主机,这是迄今为止最快的方式。