Php 在后台执行脚本
我一直试图处理的代码有一个小问题。在我的项目中,我尝试在不同的时间使用php发送邮件,其中大多数是由用户触发的。因为有不同的邮寄点和页面,所以我创建了一个单一的邮寄脚本,在该脚本中我将所有邮寄请求发送到(这样,所有电子邮件都从一个页面发送) 例如,注册后,来自注册脚本的验证代码被发送到邮件脚本,邮件脚本向用户发送验证电子邮件。然后,注册脚本等待邮件脚本的响应,然后再重定向到下一页。但是由于很多因素,邮件脚本需要一些时间才能加载 我不希望用户经历这种延迟,因此我一直在寻找一种方法,在后台将数据发送到邮件脚本,同时用户被重定向到另一个页面,而不是等待邮件脚本的响应 我曾尝试使用AJAX直接从前端发送数据,但我使用了一个验证过程,其中某些值通过了数据库的身份验证,因此我必须从注册脚本发送。我一直在寻找用于AJAX的php等价物,在重定向用户之前,我不必等待邮件脚本的响应。我试过卷曲,但不知怎的,它仍然在等待响应 这是我的cURL代码:Php 在后台执行脚本,php,mysql,ajax,curl,phpmailer,Php,Mysql,Ajax,Curl,Phpmailer,我一直试图处理的代码有一个小问题。在我的项目中,我尝试在不同的时间使用php发送邮件,其中大多数是由用户触发的。因为有不同的邮寄点和页面,所以我创建了一个单一的邮寄脚本,在该脚本中我将所有邮寄请求发送到(这样,所有电子邮件都从一个页面发送) 例如,注册后,来自注册脚本的验证代码被发送到邮件脚本,邮件脚本向用户发送验证电子邮件。然后,注册脚本等待邮件脚本的响应,然后再重定向到下一页。但是由于很多因素,邮件脚本需要一些时间才能加载 我不希望用户经历这种延迟,因此我一直在寻找一种方法,在后台将数据发送
$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发送到本地主机,这是迄今为止最快的方式。