时间:2021-07-01 10:21:17 帮助过:6人阅读
最近开发中遇到这么一个问题,程序第4行会请求一个url,但是这个url的响应时间很长,而且我的程序中用不到他的返回值,所以我在想能不能在第4行发送请求之后不用等待他返回值,直接执行第5行代码,可以吗?如果可以的话,怎么做到?
http://www.laruence.com/2008/04/14/318.html
sleep(10)这个长达10秒的操作由正在提供Web服务的PHP进程来处理显然是不合适的,因为这肯定会造成一个PHP工作进程被阻塞.这时可以考虑用popen或proc_open异步调用一个CLI程序进行一些耗时的操作.
- <code>/www/index.php
- <!--?php
- $sec = 10;
- //pclose(popen('/www/cli.php '.$sec.' &', 'r'));
- pclose(popen("/www/cli.php -s $sec &", 'r'));
- /www/cli.php
- #!/png/php/5.4.39NTS/bin/php
- <?php
- $argv = getopt('s:');
- sleep($argv['s']);
- file_put_contents('/www/cli.txt', $argv['s']);
- //print_r($argv);
- //cli.php处理完耗时的任务后往数据库存结果,浏览器端用AJAX轮询异步得到数据.</code--></code>
如果你用不到这个返回,你可以直接把这个地址存到数据库,由别的程序在服务器上执行
要是用php-fpm可以看看这个函数fastcgi_finish_request
你把运行慢的代码写在这个函数之后就可以了
http://php.com/manual/zh/function.fastcgi-finish-request.php
可以使用 php 异步扩展 swoole.
可以用多线程,pthread扩展,http://php.com/manual/en/book.pthreads.php
把请求操作放在队列中,异步执行
- <code><!--?php
- $context = stream_context_create(array(
- 'http' =--> array(
- 'timeout' => 5
- )
- ));
- $contents = file_get_contents('http://www.google.com', 0, $context);
- echo '5秒后到这'
- ?></code>
用队列请求
用队列请求
用队列请求
这肯定是不可以的 !
要么你使用队列执行 .
要么 你用 swoole 或者 Node.js
PHP 在设计上就决定了 , 它只能从头到尾执行 。
生产者/消费者模式
简单粗暴的写法,可以把这个逻辑用register_shutdown_function()执行
你不需要返回一个请求的内容 你去请求他干啥。。。
人气教程排行
-
174次
1
php如何获取跳转前的url
-
174次
2
php格林威治时间转换成当前时间的方法
-
174次
3
为什么php不能做大型系统?
-
174次
4
range函数怎么用
-
174次
5
php中计算页面加载时间几种方法总结_PHP教程
-
174次
6
求帮助,关于paypal支付返回值修改订单状态
-
174次
7
typecho怎么配置文章内容页?
-
174次
8
PhpStorm左侧structure不显示文件的方法列表是这么回事?
-
174次
9
查看PHP的环境变量_PHP
-
174次
10
PHP Primary script unknown 解决方法总结
-
174次
11
php的命名空间与自动加载实现方法
-
174次
12
解决laravel 出现ajax请求419(unknown status)的问题
-
173次
13
php 如何删除mysql记录
-
173次
14
PHP如何替换数组中的指定元素
-
173次
15
怎么去除字符串中非汉字、非字母、非数字的字符
-
173次
16
mysql如何一次执行多条SQL语句
-
173次
17
修改header里面的Connection为close解决方法
-
173次
18
PHP基于session.upload_progress 实现文件上传进度显示功能详解
-
173次
19
php5.6.x到php7.0.x特性小结
-
172次
20
php为什么会出现504错误