更新:安装测试 - 它的工作原理 - 但是我的网络主机在大约6秒钟内无法处理600封电子邮件 - 我让每个连接等待20秒,然后发送一封邮件 - 这些都经过了
我有一个包含600多封电子邮件的邮件列表 我有发送600多封电子邮件的功能
不幸的是,执行时间(90秒)存在限制 - 因此脚本在完成之前就会关闭。我无法使用set_time_limit(0)
更改时间,因为它是由我的网络主机设置的(不在我可以更改的ini文件中)
我的解决方案是将主要文件的帖子请求发送到子文件,该子文件一次发送100封邮件的块。但这些是否会毫不拖延地发送 - 或者他们会在发送下一个请求之前等待答案吗?
代码:
for($i=0;$i<$mails;$i+100) {
$url = 'http://www.bedsteforaeldreforasyl.dk/siteadmin/php/sender.php';
$myvars = 'start=' . $i . '&emne=' . $emne . '&besked=' . $besked;
$ch = curl_init( $url );
curl_setopt( $ch, CURLOPT_POST, 1);
curl_setopt( $ch, CURLOPT_POSTFIELDS, $myvars);
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt( $ch, CURLOPT_HEADER, 0);
curl_setopt( $ch, CURLOPT_SAFE_UPLOAD, 0);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt( $ch, CURLOPT_TIMEOUT, 1);
$response = curl_exec( $ch );
curl_close($ch);
}
$mails
是收件人总数
$start
是SQL语句
这(我希望)是否会启动6个并行连接 - 或者它(因为我担心)会逐个启动6个进程吗?
在接收脚本中我有:
<br>
ignore_user_abort(true);<br>
$q1 = "SELECT * FROM maillist LIMIT $start,100 ORDER BY navn";
答案 0 :(得分:1)
我将就如何实现目标提供一些想法。
第一个选项 - 使用curl_multi_*
套件。它提供非阻塞的cURL请求。
2。第二个选项 - 使用amphp或ReactPHP等异步库。虽然它基本上可以提供与curl_multi_*
,IIRC相同的好处。
使用pcntl_fork()
创建单独的进程并在作业节点中分发作业。
使用pthreads扩展,它实质上提供了真正的多线程的用户态PHP实现。
我会警告你,最后两个选项应该是最后的选择,因为并行处理世界出现了一些可能被证明非常讨厌的怪异情况; - )。
我也可能建议您,如果您计划扩展此类应用程序,它将是使用某些外部服务的最佳行动方案。
答案 1 :(得分:1)
创建六个php脚本,每100封电子邮件一个(或将值(例如0-5)传递给单个脚本)。
创建一个主脚本来调用这六个子脚本。
使用stream_socket_client()
调用子脚本。
六个脚本将同时运行
您可以捕获子脚本回显的任何内容(例如状态)。
$timeout = 120;
$buffer_size = 8192;
$result = array();
$sockets = array();
$id = 0;
header('Content-Type: text/plain; charset=utf-8');
$urls[] = array('host' => 'www.example.com','path' => "http://www.example.com/mail1.php");
$urls[] = array('host' => 'www.example.com','path' => "http://www.example.com/mail2.php");
$urls[] = array('host' => 'www.example.com','path' => "http://www.example.com/mail3.php");
$urls[] = array('host' => 'www.example.com','path' => "http://www.example.com/mail4.php");
$urls[] = array('host' => 'www.example.com','path' => "http://www.example.com/mail5.php");
$urls[] = array('host' => 'www.example.com','path' => "http://www.example.com/mail6.php");
foreach($urls as $path){
$host = $path['host'];
$path = $path['path'];
$http = "GET $path HTTP/1.0\r\nHost: $host\r\n\r\n";
$stream = stream_socket_client("$host:80", $errno,$errstr, 120,STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT);
if ($stream) {
$sockets[] = $stream; // supports multiple sockets
fwrite($stream, $http);
}
else {
$err .= "$id Failed<br>\n";
}
}
echo $err;
while (count($sockets)) {
$read = $sockets;
stream_select($read, $write = NULL, $except = NULL, $timeout);
if (count($read)) {
foreach ($read as $r) {
$id = array_search($r, $sockets);
$data = fread($r, $buffer_size);
if (strlen($data) == 0) {
// echo "$id Closed: " . date('h:i:s') . "\n\n\n";
$closed[$id] = microtime(true);
fclose($r);
unset($sockets[$id]);
}
else {
$result[$id] .= $data;
}
}
}
else {
// echo 'Timeout: ' . date('h:i:s') . "\n\n\n";
break;
}
}
var_export($result);