php fsockopen 并发 求教 fsockopen 并发。我想发邮件 不知道 fsockopen 这个怎么并发邮件 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 phpmailer,求楼主别再执迷不悟。 fsockopen 的确可以并发 只是现在我这里的代码 我没看懂 怎么并发 所以到这来问问 你可以ajax循环执行发送邮件,也可以用下面两个方法(西面代码是大致思路):if (isset($_GET['act']) && $_GET['act'] == 'sendMail') { sendEmail();// 发送邮件操作}function fSockGet($url, $timeout = 3){ $info = parse_url($url); extract($info); $query = isset($query) ? trim($query) : ''; $path = isset($path) ? trim($path) : ''; $fp = fsockopen($host, 80, $errno, $errstr, $timeout); if (!$fp) { exit("$errstr ($errno)<br>\n"); } $write = fwrite($fp, "GET {$path}?{$query} HTTP/1.0\r\nHost: {$host}\r\n\r\n");// while (!feof($fp)) {// echo fread($fp, 4096);// }}$url = "http://mydir.com/index.php?act=sendMail";$emailList = array(...);foreach ($emailList as $email) { fSockGet($url);} 上面我发送不是针对fsockopen来发邮件,而是针对你所说的并发 利用 sock 发送邮件,就需要自行完成 email 协议的全部对话过程这可不是一个简单的过程,所以通常用 phpmailer 类来完成(要是简单,就不需要写成类了)你可以通过 fsockopen 触发使用 phpmaile 发送邮件的程序,并不等待其返回就是通常说的伪多进程 就看到foreach 循环 然后再哪里关闭啊? 在方法fSockGet末尾关闭,我忘记关闭了 fSockGet这个方法是我写的,它可以实现并发,例如你循环执行fSockGet,那么没循环一次fSockGet,就算增加了一个并发 fputs ( $fp, "QUIT " . "\r\n" );fgets ( $fp, 512 );fclose ( $fp );这个不是发送关闭?你的在哪里关闭??? function fSockGet($url, $timeout = 3){ ... ... ... fclose($fp); // << 这里关闭} 对于 #3 的代码:因为 fsockopen 是在 fSockGet 函数中的,所以无需显式的关闭。退出函数就自动关闭了fSockGet 函数实际上是通过 fsockopen 打开了原程序。这就是所谓的伪多进程有一点需要注意:if (isset($_GET['act']) && $_GET['act'] == 'sendMail') { sendEmail();// 发送邮件操作}这里才是真正的发送邮件的不过执行完 sendEmail 后没有终止程序,于是将会去执行尾部的foreach ($emailList as $email) {这将导致系统崩溃 的确,楼主要注意了,不然就死循环了因为 fsockopen 是在 fSockGet 函数中的,所以无需显式的关闭。退出函数就自动关闭了有收获了 嗯,不是死循环!而是雪崩比如 $emailList 中有2项当然是他会正常结束的但他触发了2个程序进程,而每个程序进程又会触发2个程序进程。于是 1 2 4 8 16 32 64 128 256 .... php处理不了这么多。我使用fsockopen下载网页,同一此请求中只能下载一张。多一张就卡得要死。如果批量,基本上是无法下载,连一张都无法下载,而且还死机,重启apache都好不过来。 mysql 的查询嵌套问题。 如何做到对应编号导入数据? 分頁顯示問題 今天闲着无事,制作的Apache+PHP+MySQL+phpMyAdmin集成包,欢迎下载使用 form里两个submit时的参数传递 请教关于文件列表 100分问题-GD 库里能否实现让字体扭曲效果的功能? 如何把 EXCEL的内容导入mysql? Programming PHP书中的问题? 請熟LDAP函數的朋友幫幫忙. php 如何实现 keep-alive php中使用GD2库创建图形在浏览器中显示不出来
sendEmail();// 发送邮件操作
}function fSockGet($url, $timeout = 3)
{
$info = parse_url($url);
extract($info);
$query = isset($query) ? trim($query) : '';
$path = isset($path) ? trim($path) : ''; $fp = fsockopen($host, 80, $errno, $errstr, $timeout);
if (!$fp) {
exit("$errstr ($errno)<br>\n");
} $write = fwrite($fp, "GET {$path}?{$query} HTTP/1.0\r\nHost: {$host}\r\n\r\n");// while (!feof($fp)) {
// echo fread($fp, 4096);
// }
}
$url = "http://mydir.com/index.php?act=sendMail";
$emailList = array(...);
foreach ($emailList as $email) {
fSockGet($url);
}
这可不是一个简单的过程,所以通常用 phpmailer 类来完成(要是简单,就不需要写成类了)你可以通过 fsockopen 触发使用 phpmaile 发送邮件的程序,并不等待其返回
就是通常说的伪多进程
就看到foreach 循环 然后再哪里关闭啊?
在方法fSockGet末尾关闭,我忘记关闭了
fgets ( $fp, 512 );
fclose ( $fp );这个不是发送关闭?你的在哪里关闭???
{
...
...
...
fclose($fp); // << 这里关闭
}
因为 fsockopen 是在 fSockGet 函数中的,所以无需显式的关闭。退出函数就自动关闭了fSockGet 函数实际上是通过 fsockopen 打开了原程序。这就是所谓的伪多进程有一点需要注意:
if (isset($_GET['act']) && $_GET['act'] == 'sendMail') {
sendEmail();// 发送邮件操作
}
这里才是真正的发送邮件的
不过执行完 sendEmail 后没有终止程序,于是将会去执行尾部的
foreach ($emailList as $email) {
这将导致系统崩溃
的确,楼主要注意了,不然就死循环了因为 fsockopen 是在 fSockGet 函数中的,所以无需显式的关闭。退出函数就自动关闭了
有收获了
比如 $emailList 中有2项
当然是他会正常结束的
但他触发了2个程序进程,而每个程序进程又会触发2个程序进程。
于是 1 2 4 8 16 32 64 128 256 ....