-
2021-04-19 02:33:23
注意事项
不要在代码中执行sleep以及其他睡眠函数,这样会导致整个进程阻塞
exit/die是危险的,会导致Worker进程退出
可通过register_shutdown_function来捕获致命错误,在进程异常退出时做一些清理工作
PHP代码中如果有异常抛出,必须在回调函数中进行try/catch捕获异常,否则会导致工作进程退出
不支持set_exception_handler,必须使用try/catch方式处理异常
异步编程
异步程序要求代码中不得包含任何同步阻塞操作
异步与同步代码不能混用,一旦应用程序使用了任何同步阻塞的代码,程序即退化为同步模式
类/函数重复定义
新手非常容易犯这个错误,由于Swoole/workerman是常驻内存的,所以加载类/函数定义的文件后不会释放。因此引入类/函数的php文件时必须要使用include_once或require_once,否会发生cannot redeclare function/class 的致命错误。
内存管理
PHP守护进程与普通Web程序的变量生命周期、内存管理方式完全不同。
进程隔离也是很多新手经常遇到的问题。修改了全局变量的值,为什么不生效,原因就是全局变量在不同的进程,内存空间是隔离的,所以无效
更多相关内容 -
同步、异步
2021-04-12 17:16:50## 同步、异步本文不直接讲同步、异步、阻塞、非阻塞、串行、并行、并发的概念理论,而是试图从多个方面讨论来帮助你理解。>[danger] **以下讨论如...## 同步、异步

本文不直接讲同步、异步、阻塞、非阻塞、串行、并行、并发的概念理论,而是试图从多个方面讨论来帮助你理解。
>[danger] **以下讨论如没有特别说明,所说的程序都是指的线程(最小粒度的执行实例 / 程序执行流的最小单元),这样才准确,才有现实意义。**
[PHP socket初探 --- 关于IO的一些枯燥理论](https://blog.ti-node.com/blog/6389362802519179264)
> 同步,异步,阻塞,非阻塞,甚至是同步阻塞,同步非阻塞,异步阻塞,异步非阻塞.是不是晕了?截至到目前为止,你可以简单地认为只要搞明白这几个名词的含义以及区别,就算弄明白IO了,至少了可以继续往下看了.
> 如果你仔细品过上面案例中的每一个字,你就能慢慢体会到之所以异步和非阻塞,同步和阻塞容易混淆,仅仅是因为二者的表现形式稍微有点儿相似而已.
>
> **阻塞和非阻塞关注的是:** 在等馒头的过程中,你在干啥.
> **同步和异步关注的是:** 等馒头这件事,你是一直等到"馒头出炉"的结果,还是立即跑路等阿梅告诉你的"馒头出炉".重点的是你是如何得知"馒头出炉"的.
>
> 所以现实世界中,最傻的人才会采用异步阻塞的IO方式去写程序(**等的过程不能干别的,另外结果还得通过别人获知。**).其余三种方式,更多的人都会选择同步阻塞或者异步非阻塞.同步非阻塞最大的问题在于,你需要不断在各个任务中忙碌着,导致你的大脑混乱,非常累.
>
>
*****
### 1. IO模型
从程序处理IO的方式来看,有以下关系:
| | **同步** | **异步** |
|---|---|---|
| **阻塞** | 同步阻塞 | 异步阻塞 |
| **非阻塞** | 同步非阻塞 | 异步非阻塞 |
**名词解释:**
| 名词 | 解释 |
|---|---|
| **阻塞** | 例:A调用B,在B返回前,A除了一直等着之外,什么都做不了 |
| **非阻塞** | 例:A调用B,在B返回前,A还可以做别的 |
| **同步** | 自己得到结果;调用方依赖被调用方返回的结果 |
| **异步** | 不是自己直接得到结果;调用方不依赖被调用方返回的结果 |
*****
### 2. 执行顺序
从程序的执行顺序上来看,两个相关的程序有两种顺序关系:
| 名词 | 解释 |
|---|---|
| **串行** | 指两个线程的执行顺序是有先后关系的 |
| **并行** | 指两个线程的执行顺序关系是同时执行的 |
> 注意:在单核CPU上的并行其实是一种假象(由于进程切换太快,让我们几乎感觉不到,误以为是同时执行的),但我们理解为两个程序在同一刻执行也没有什么错。在多核CPU上存在真正的并行,不过也无法严格证明。(由于时间刻度可以无限细分,对于同时的概念没有绝对的,不绝对准确的理解也没有错,这就是理论上存在,但是却无法证明)
*****
### 3. 从对外提供服务上来看
**并发:** 如果一个系统可以同时为多人提供服务,或者能同时提供多种服务,那么此系统就是一个支持并发的系统,反之就不算是一个支持并发的系统。(**这里的 “能同时为多人提供服务” 并不是指多个用户的操作要在同时进行**)
ATM机就不是一个并发系统,Apache和Nginx就是支持并发的系统,并发能力也是有极限的,这点请查阅相应系统的配置。
[高并发的那点事儿](https://mp.weixin.qq.com/s/n9FnQq2K93JTTr1kMkwJaw)
> 如果一个系统支持两个或多个动作(Action)同时存在,那就是一个并发系统,如一个秒杀商城,可以同时支持大量的下单处理。如果一个系统支持两个或多个动作同时执行,那就是一个并行系统,如一个多线程爬虫。
[漫话:如何给女朋友解释为什么双11无法修改收货地址](https://mp.weixin.qq.com/s/En4Tv_32TLz_WpmWJfuM_g)
>[danger] **排队中的用户也是并发用户。** 如果一个系统能同时服务多个用户,那就是一个支持并发的系统, **这个服务并不是指多个用户的操作要在同时进行。** 多个操作同时进行,称之为并行系统。
*****
至此,我们已经从三个方面讨论了:同步、异步、阻塞、非阻塞、串行、并行、并发,相信对于程序的执行细节,你比以往都有更清晰的理解了(建议结合 [IO模型 · php笔记 · 看云](https://www.kancloud.cn/xiak/php-node/786007) 一起阅读效果会更好)。
*****
### 扩展
~~~
拿餐馆作比喻
同步就是一个奶茶店只有两个窗口,人多了就进不来,都得排队买,一次只能同时服务两个人。
异步就是,还是两个窗口,但是额外多了一个凉亭作为休息等候的地方,不管来多少人,都可以接待,每个人点什么直接由传菜员记录,拿到后厨做,点好后会给你一个号,谁的奶茶好了就喊谁取,大家都不用再站着排队了。
~~~
[IO模型 · php笔记 · 看云](https://www.kancloud.cn/xiak/php-node/786007)
[就为了一个原子操作,其他CPU核心罢工了](https://mp.weixin.qq.com/s/jx0EajGXGrM3fR14P9Bm7Q)
*****
last update:2018-10-21 01:58:15
-
php同步接口和异步接口的用法
2021-04-24 15:24:04请求数据,等待服务响应,服务器把处理结果返回给你,这是完整的同步接口实例,但是也有写情况下也需要异步接口,比如当用户请求的结果比较慢,客户端又没有耐心等待他的返回。这时候 异步接...同步接口
指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程,如果超过超时限制会返回超时。
异步接口
指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。
通常情况下,我们使用的都是同步接口。请求数据,等待服务响应,服务器把处理结果返回给你,这是完整的同步接口实例,但是也有写情况下也需要异步接口,比如当用户请求的结果比较慢,客户端又没有耐心等待他的返回。这时候 异步接口就显得很有优势。
一般异步接口会由两步分组成1.同步返回 2异步通知
比较特色的例子就是支付宝支付接口,当你发起支付的时候,支付宝系统收到你的结果,通知你。
支付成功后,异步接口确认处理完成。
在php中,异步接口的实现如下
1.客户端页面采用AJAX技术请求服务器
优点:最简单,也最快,就是在返回给客户端的HTML代码中,嵌入AJAX调用,或者,嵌入一个img标签,src指向要执行的耗时脚本。
缺点:一般来说Ajax都应该在onLoad以后触发,也就是说,用户点开页面后,就关闭,那就不会触发我们的后台脚本了。
而使用img标签的话,这种方式不能称为严格意义上的异步执行。用户浏览器会长时间等待php脚本的执行完成,也就是用户浏览器的状态栏一直显示还在load。
当然,还可以使用其他的类似原理的方法,比如script标签等等。
2.popen()函数
该函数打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。
所以可以通过调用它,但忽略它的输出。使用代码如下:
pclose(popen("/home/xinchen/backend.php &", 'r'));
优点:避免了第一个方法的缺点,并且也很快。
缺点:这种方法不能通过HTTP协议请求另外的一个WebService,只能执行本地的脚本文件。并且只能单向打开,无法穿大量参数给被调用脚本。并且如果,访问量很高的时候,会产生大量的进程。如果使用到了外部资源,还要自己考虑竞争。
3.CURL扩展
$ch = curl_init();
$curl_opt = array(CURLOPT_URL, 'http://www.example.com/backend.php',
CURLOPT_RETURNTRANSFER, 1,
CURLOPT_TIMEOUT, 1,);
curl_setopt_array($ch, $curl_opt);
curl_exec($ch);
curl_close($ch);
缺点:如你问题中描述的一样,由于使用CURL需要设置CUROPT_TIMEOUT为1(最小为1,郁闷)。也就是说,客户端至少必须等待1秒钟。
4.fscokopen()函数
fsockopen支持socket编程,可以使用fsockopen实现邮件发送等socket程序等等,使用fcockopen需要自己手动拼接出header部分
可以参考: http://cn.php.net/fsockopen/
使用示例如下:
$fp = fsockopen("www.34ways.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)
\n";} else {
$out = "GET /index.php / HTTP/1.1\r\n";
$out .= "Host: www.34ways.com\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
/*忽略执行结果
while (!feof($fp)) {
echo fgets($fp, 128);
}*/
fclose($fp);
}
缺点:fscokopen的问题和popen 一样,并发非常多时会产生很多子进程,当达到apache的连接限制数时,就会挂掉,我问题已经说了这种情况。
5:其他方式
比如tcp,udp,mqtt等方式。
mqtt:直接发布消息,连接数一般都很大,能满足很多需求。发布速度快,比较稳定。当订阅收到消息后会自动处理。
-
PHP cURL同步和异步
2021-03-26 13:15:38以下是PHPDocs中如何异步使用curl的示例:// create both cURL resources$ch1 = curl_init();$ch2 = curl_init();// set URL and other appropriate optionscurl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/");...以下是PHP
Docs中如何异步使用curl的示例:
// create both cURL resources
$ch1 = curl_init();
$ch2 = curl_init();
// set URL and other appropriate options
curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);
//create the multiple cURL handle
$mh = curl_multi_init();
//add the two handles
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);
$active = null;
//execute the handles
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
//close the handles
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
?>
-
用Ajax实现同步和异步有什么区别
2021-05-05 09:57:25通过ajax向后台发送和接收数据时,常常会出现同步异步问题。由于ajax是默认异步加载的,但有时候需要同步或者同步的效果,有以下两种解决方案。方案一:将某些方法放在回调函数中执行,即,等到从后台返回成功后再... -
java中同步与异步区别是什么
2021-02-12 11:06:00一、同步与异步概念:(推荐:java视频教程)1.同步:所有的操作都做完,才返回给用户。这样用户在线等待的时间太长,给用户一种卡死了的感觉(就是系统迁移中,点击了迁移,界面就不动了,但是程序还在执行,卡死了的... -
ajax请求的同步异步问题
2021-08-06 08:56:23好了以后使用ajax时,一定要注意同步异步的问题啦~~~ jquery ajax属性async(同步异步)示例 在jquery的ajax中如果我们希望实现同步或者异步我们可以直接设置async发生为真或假即可true false,下面举几个jquery ajax... -
php app支付宝回调(异步通知)详解
2020-10-18 07:58:05主要为大家详细介绍了php app支付宝回调的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
php 异步调用方法实现示例
2021-01-05 18:01:53但因为php是同步执行的,所以客户端需要等待服务处理完才可以进行下一步。 因此对于耗时的操作适合异步执行,服务器接收到请求后,处理完客户端需要的数据就返回,再异步在服务器执行耗时的操作。 1.使用Ajax 与 img... -
PHP 支付同步和异步回调
2022-02-16 11:27:17require_once './plugin/alipay/pagepay/service/AlipayTradeService.php'; $data=input(); dd($data); $alipaySevice = new \AlipayTradeService($config); $result = $alipaySevice->check($data); if($result){ ... -
HttpClient组件提供了强大的方法来同步或异步获取HTTP资源。-PHP开发
2021-05-27 07:48:05HttpClient组件HttpClient组件提供了强大的方法来同步或异步获取HTTP资源。 该组件是实验性的。 Symfony的向后兼容HttpClient组件未涵盖实验性功能。HttpClient组件提供了强大的方法来同步或异步获取HTTP资源。 资源... -
jquery ajax属性async(同步异步)示例
2020-12-11 04:24:27例1、jquery+ajax/” target=”_blank”>jquery ajax同步方式 代码如下:$.ajax({url : ‘test.php’,type : ‘post’,async: false,//使用同步的方式,true为异步方式data : {‘act’:’addvideo’, ‘videoname’:... -
同步与异步、异步与回调
2021-03-26 15:46:22同步与异步:function a(){}function b(){}a();b();以上为同步代码,函数b必须等函数a执行完毕后才能执行。function a(){setTimeout(function(){b();}, 1000);};function c(){};a();c();首先执行函数a,而且不等... -
Icicle是一个PHP库,用于使用同步编码技术编写异步代码-PHP开发
2021-05-27 07:48:54Icicle Icicle是一个PHP库,用于使用同步编码技术编写异步代码。 Icicle使用由Awaitables和Generators生成的协程来使用通常使用的技术来编写异步代码,以方便使用Ampv2.0。Icicle现在已被弃用。 此版本目前正在开发... -
ajax的同步和异步有怎样的区别?ajax同步与异步的区别介绍
2021-03-23 14:52:01对于ajax我们应该知道ajax是主要用来在前端页面中向服务器后端请求数据,ajax中根据async的值不同分为同步(async = false)和异步(async = true)两种执行方式,那么,ajax的同步和异步请求两种方式有什么区别呢?... -
深入理解ajax同步和异步的区别
2021-03-23 14:51:57示例:a. 说明:b. 原代码:vara=0functionloadDoc(file,async=true){if(window.XMLHttpRequest){//codeforIE7+,Firefox,Chrome,Opera,Safarixmlhttp=newXMLHttpRequest();}else{//codeforIE6,IE5... -
同步请求和异步请求的区别详解
2021-04-10 13:02:40先解释一下同步和异步的概念同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。 异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。同步通信方式与异步... -
4种PHP异步执行的常用方式
2020-12-18 19:45:47但因为php是同步执行的,所以客户端需要等待服务处理完才可以进行下一步。 因此对于耗时的操作适合异步执行,服务器接收到请求后,处理完客户端需要的数据就返回,再异步在服务器执行耗时的操作。 1.使用Ajax 与 img... -
ajax中的async属性值之同步和异步及同步和异步区别
2021-08-06 07:44:36jquery中ajax方法有个属性async用于控制同步和异步,默认是true,即ajax请求默认是异步请求,有时项目中会用到AJAX同步。这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面出现假死... -
node.js中的forEach()是同步还是异步呢
2020-10-24 19:30:09主要讨论并验证了node.js中的forEach()是同步还是异步,思路和方法分享给大家,有需要的小伙伴可以参考下。 -
同步计数器和异步计数器的区别是什么
2021-04-30 02:15:24区别:同步计数器的触发信号是同一个信号,而异步计数器的触发信号时不同的。同步计数器同步清零就是一定要等到时钟脉冲有效的时候才能进行清零操作,而对于异步计数器来讲,清零就是不用看时钟脉冲,只需一置清零端... -
JS同步异步的应用场景
2019-08-02 16:30:10JS是单线程语言,凡是需要程序等待的都需要采用异步来执行,或者可以说叫程序阻塞 简单介绍: 1.网络请求:ajax请求、动态加载(onLoad方法) console.log(100); $.ajax({ method:‘GET’, url:‘test.php’, success... -
支付宝异步验签和同步验签
2021-05-08 01:42:02支付一切正常,异步通知一切正常,异步验证正常。唯独在查询订单和返回数据两个地方搞了半天,会返回“验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配,网关生成的验签字符串为”。从头到尾检查代码找不... -
web中的同步请求和异步请求的差别(重点是ajax中的同步与异步)
2016-11-20 19:53:31此前,对于web中同步请求和异步请求的概念模糊不清,不过对于这样的知识盲点,不去克服的话都不好意思说自己是一名前端开发人员了[捂脸][捂脸]。还好,功夫不负有心人。通过自己的方式终于让自己理解了,这两个概念... -
php – file_get_contents同步或异步
2021-04-21 09:52:21绝对不是同步与异步的问题.但是调试是非常不可能的.尝试这样的事情.死亡陈述很难看,但说明了你可能希望合并的验证……$data = file_get_contents("http://example.com/aaa.php?user=tester&akey=abcdef1234");if... -
php ajax异步读取rss文档数据
2021-01-20 01:21:43本文实例为大家分享了php ajax异步读取rss文档数据的相关代码,供大家参考,具体内容如下 代码如下: index.html <html> <head> [removed] function showRSS(str) { if (str.length==0) { ... -
mysql同步复制和异步复制的区别是什么?
2021-01-19 14:21:41区别:1、异步复制是Master将事件写入binlog,自身并不知道slave是否...相关学习推荐:mysql教程(视频)mysql同步复制和异步复制的区别:异步复制MySQL复制默认是异步复制,Master将事件写入binlog,提交事务,自身并... -
Ajax 同步异步互相转换以及区别
2019-07-26 14:42:00Ajax同步异步的区别: xmlHttp.open(method,url,async); async:布尔值,用来说明请求是否为异步模式。是来控制JavaScript如何执行该请求。 异步请求:当async设置为true时,将以异步模式发送请求,JavaScript代码... -
Ajax 同步异步和跨域问题
2021-08-06 09:57:44最近做项目,遇到了Ajax同步异步和跨域的问题,整理总结如下:关于同步、异步手册中时这样写的,默认是异步,为了并行加载,尽量不要设置为同步,因为同步时浏览器会被锁死。但根据实际情况而定,如果你需要通过请求...