有没有一种在PHP中实现多线程模型的现实方法,无论是真实的,还是仅仅模拟它.一段时间后,有人建议你可以强制操作系统加载另一个PHP可执行文件实例并处理其他同步进程.
这个问题是当PHP代码完成执行时,PHP实例仍然在内存中,因为没有办法从PHP中删除它.因此,如果您正在模拟几个线程,您可以想象会发生什么.所以我仍然在寻找一种可以在PHP中有效地完成或模拟多线程的方法.有任何想法吗?
我打算使用PHP来满足一个简单的要求.我需要从URL下载XML内容,我需要向该URL发送HTTP GET请求.
我如何在PHP中执行此操作?
我需要在用户操作时执行目录副本,但目录非常大,所以我希望能够执行这样的操作,而无需用户知道副本完成所需的时间.
任何建议将不胜感激.
PHP中有没有办法进行异步HTTP调用?我不关心响应,我只想做类似的事情file_get_contents()
,但是在执行其余代码之前不要等待请求完成.这对于在我的应用程序中引发排序的"事件"或触发长进程非常有用.
有任何想法吗?
我正在使用file_get_contents()来访问URL.
file_get_contents('http://somenotrealurl.com/notrealpage');
Run Code Online (Sandbox Code Playgroud)
如果URL不是真实的,则返回此错误消息.如何才能优雅地将其置于错误状态,以便我知道页面不存在并相应地执行操作而不显示此错误消息?
file_get_contents('http://somenotrealurl.com/notrealpage')
[function.file-get-contents]:
failed to open stream: HTTP request failed! HTTP/1.0 404 Not Found
in myphppage.php on line 3
Run Code Online (Sandbox Code Playgroud)
例如在zend你可以说: if ($request->isSuccessful())
$client = New Zend_Http_Client();
$client->setUri('http://someurl.com/somepage');
$request = $client->request();
if ($request->isSuccessful()) {
//do stuff with the result
}
Run Code Online (Sandbox Code Playgroud) 有没有办法在PHP中关闭连接(基本上告诉浏览器,而不是没有更多的数据),但继续处理.我想到的具体情况是我想要提供缓存数据,然后如果缓存已过期,我仍然会提供缓存数据以获得快速响应,关闭连接,但继续处理以重新生成并缓存新数据.基本上唯一的目的是使网站看起来更具响应性,因为在用户等待内容重新生成时不会偶尔出现延迟.
更新:
PLuS最接近我正在寻找的答案.为了澄清一些人,我正在寻找能够实现以下步骤的东西:
更新:
这很重要,它必须是纯粹的PHP解决方案.安装其他软件不是一种选择.
我有一个简单的代码,可以对URL执行头请求,然后打印响应头.我注意到在某些网站上,这可能需要很长时间才能完成.
例如,请求http://www.arstechnica.com
大约需要两分钟.我使用另一个执行相同基本任务的网站尝试了相同的请求,并立即返回.所以我必须设置错误导致这种延迟的东西.
这是我的代码:
$ch = curl_init();
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 20);
curl_setopt ($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
// Only calling the head
curl_setopt($ch, CURLOPT_HEADER, true); // header will be at output
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'HEAD'); // HTTP request is 'HEAD'
$content = curl_exec ($ch);
curl_close ($ch);
Run Code Online (Sandbox Code Playgroud)
以下是指向具有相同功能的网站的链接:http://www.seoconsultants.com/tools/headers.asp
上面的代码,至少在我的服务器上,需要两分钟才能检索到www.arstechnica.com,但上面链接中的服务会立即返回.
我错过了什么?
是否可以使用phpmailer发送异步电子邮件?
常规邮件发送代码段如下:
$mail->Send();
在等待继续之前,PHP等待Send()返回结果.有没有可能让phpmailer立即返回结果,而无需等待真正的电子邮件发送例程完成.
我正在使用PHPMailer发送效果很好的电子邮件.但问题是,由于它同步发送电子邮件,后续页面加载需要很长时间.
我正在使用PhpMailer,如本例所示https://github.com/PHPMailer/PHPMailer/blob/master/examples/gmail.phps
我想知道是否有办法使电子邮件传递异步.我对此进行了研究,发现sendmail可以选择将DeliveryMode设置为"后台模式" - 来源http://php.net/manual/en/function.mail.php
mail($to, $subject, $message, $headers, 'O DeliveryMode=b');
Run Code Online (Sandbox Code Playgroud)
我想知道在PhpMailer中是否可以做类似的事情?有人有这个成功吗?
编辑: - (附加信息)好像PhpMailer可以配置为使用sendmail - https://github.com/PHPMailer/PHPMailer/blob/master/class.phpmailer.php 因此我想知道这是否可以某种方式利用启用背景交付.
/**
* Which method to use to send mail.
* Options: "mail", "sendmail", or "smtp".
* @type string
*/
public $Mailer = 'mail';
/**
* The path to the sendmail program.
* @type string
*/
public $Sendmail = '/usr/sbin/sendmail';
/**
* Whether mail() uses a fully sendmail-compatible MTA.
* One which supports sendmail's "-oi -f" options.
* @type boolean …
Run Code Online (Sandbox Code Playgroud) 我有兴趣在Web请求之后启动进程,或者可能在初始线程完成后分支新进程.
我宁愿不使用cron,因为我将要运行的作业的性质以及它们需要运行的频率,等待一分钟刷新不是一种选择.
我正在考虑这样做的几种方法:
1)中调用JavaScript的网页揭开序幕的过程,并立即返回,然后之后运行任务,例如AJAX("/ run_jobs.php?工作= 123")......你的想法
2)线程完成后分叉新线程; 即output_page(); 新线程(); run_job(123); 出口();
任何人对此主题有任何想法或有这方面的经验.
php ×9
asynchronous ×2
http ×2
phpmailer ×2
ajax ×1
cron ×1
curl ×1
email ×1
get ×1
header ×1
http-headers ×1
jobs ×1
performance ×1