PHP多个帖子请求

时间:2017-10-19 07:43:12

标签: php email curl post

更新:安装测试 - 它的工作原理 - 但是我的网络主机在大约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";

2 个答案:

答案 0 :(得分:1)

我将就如何实现目标提供一些想法。

  1. 第一个选项 - 使用curl_multi_*套件。它提供非阻塞的cURL请求。

    2。第二个选项 - 使用amphpReactPHP等异步库。虽然它基本上可以提供与curl_multi_*,IIRC相同的好处。

  2. 使用pcntl_fork()创建单独的进程并在作业节点中分发作业。

  3. 使用pthreads扩展,它实质上提供了真正的多线程的用户态PHP实现。

  4. 我会警告你,最后两个选项应该是最后的选择,因为并行处理世界出现了一些可能被证明非常讨厌的怪异情况; - )。

    我也可能建议您,如果您计划扩展此类应用程序,它将是使用某些外部服务的最佳行动方案。

答案 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);