Nginx 如何支持http和https的访问 作者: lovingyu_er 时间: 2020-09-23 17:06:00 分类: NGINX,运维优化,Swoole-PHP 评论 在配置网站的http和https访问的时候,我们一般会将http直接重定向的https的网址,我的网站在引入websocket-test测试的时候,出现了https的时候,不能测试ws的协议,安全考虑就是https网址不能访问ws,在FIrefox的浏览器中会提示: ``` DOMException: The operation is insecure. ``` 在google Chrome中会提示: ``` websocket-test.html:230 Mixed Content: The page at 'https://darrykinger.com/websocket-test.html' was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint 'ws://ws.domain.com:9502/uuid/api'. This request has been blocked; this endpoint must be available over WSS. ``` 原因:HTTPS是基于SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密,所以在HTTPS站点调用某些非SSL验证的资源时浏览器可能会阻止。同理ws和wss也是 解决方案: 配置nginx ,使其既支持https和http协议,我原来的网址访问都是从http自动跳转到https,在配置文件中,有了重定向的功能: ``` server { listen 80; server_name domain.com; return 301 https://$server_name$request_uri; } ``` 先将该模块配置注释掉: ``` #server { # listen 80; # server_name darrykinger.com; # return 301 https://$server_name$request_uri; # } ``` 在另外一个server模块中,增加一些修改,原来的配置如下:(....代表是省略了,因为在下面的配置中都没有更改) ``` server { listen 443 ; ssl on; root /usr/share/nginx/html/typecho; index index.php index.html index.htm; # Make site accessible from http://localhost/ server_name darrykinger.com; ssl_certificate /etc/nginx/cert.pem; ssl_certificate_key /etc/nginx/cert.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; .... location / { .... } ..... } ``` 更改后如下: ``` server { listen 80; listen 443 ssl; # ssl on; root /usr/share/nginx/html/typecho; index index.php index.html index.htm; # Make site accessible from http://localhost/ server_name darrykinger.com; ssl_certificate /etc/nginx/cert.pem; ssl_certificate_key /etc/nginx/cert.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ... ssl_prefer_server_ciphers on; location / { ... } .... } ``` 配置项目中,将原来的```ssl on;```修改为```ssl offf;```,也就是在访问该模块的时候,并不开启服务器与浏览器证书验证,但是并不是就关闭了```listen xx;```的此处的配置,用户可以在```listen xx;```里面进行灵活的配置.也就是在访问https的时候要进行证书验证,那么在访问http的时候,不进行证书的验证。 ######ssl参数: ``` Syntax: ssl on | off; Default: ssl off; Context: http, server ``` 该参数在```1.15.0```的版本中会被弃用。```The ssl parameter of the listen directive should be used instead.``` 这个```ssl```参数会被```listen```参数的配置中取代,所以,在进行配置的时候,要注意自己的nginx版本。
Swooel 协程的一些知识点 作者: lovingyu_er 时间: 2020-06-05 23:57:00 分类: Swoole-PHP 评论 ###协程的介绍 协程可以简单理解为线程(又叫纤程),只不过这个线程是```用户态```的,```不需要操作系统```参与,创建销毁和切换的成本非常低,如果你自己感兴趣,也可以自己用语言实现一个。和线程不同的是```协程没法利用多核 cpu ```.在```PHP```的扩展```Swoole```扩展中,如果想利用多核CPU,可以使用[```Swoole```的多进程模式](https://wiki.swoole.com/#/process "```Swoole```的多进程模式"),如果对于协程的用户态不太了解,请google一下CPU的上下文切换带来的性能问题以及进程,线程模型下CPU资源的消耗。说白了,就是协程模型下,没有CPU的上下文切换导致资源的消耗。 ####协程之间通信Channel 协程之间通信是依赖了Channel,协程(Coroutine)+通道(Channel)是组成的[CSP编程模型](https://darrykinger.com/archives/182.html "CSP编程模型")在别的编程语言实现协程通信常用的解决方案。相当于协程通信之间的消息队列,协程之间通过```push```和```pop```操作消息队列的消息,扮演了生产者和消费者的关系角色。由于协程是用户态的,```Channel```是无法跨进程的,也就是在```Swoole```内的同一个进程内通信,最典型的应用就是```连接池```和```并发调用```。 ####Swoole Channel Swoole 通过Channel 来自动实现了协程的切换和调度。 1. Swoole Channel实现原理 1.1 仅占用内存,不消耗其他的I/O资源 1.2 底层基于PHP引用计数器,没有内存的copy,即使是传递巨大字符串或数组也不会产生额外性能消耗 1.3 channel 基于引用计数实现,是零拷贝的 2. Channel相关函数 2.1 __construct( $capacity =1) 构造函数 用法:和普通的php类的构造函数一样,默认参数是$capacity=1 作用:创建一个容量大小为```$capacity```的通道,所占用的内存大小为```$capacity*sizeof(zval)```(php7 中zval的结构参考```php-src```,大小为16字节). 2.2 push() 向通道中写入数据 2.3 pop() 通道中读取数据 其他的方法请参考[swoole channel 方法列表](https://wiki.swoole.com/#/coroutine/channel?id=%e6%96%b9%e6%b3%95 "swoole channel 方法列表")
使用swoole的协程出现Co\run function找不到 作者: lovingyu_er 时间: 2020-05-26 01:21:16 分类: 编程语言,PHP,php7底层设计和源码实现,Swoole-PHP 评论 ``` PHP Fatal error: Uncaught Error: Call to undefined method Swoole\Coroutine\Server::handler() in /Users/darry/php_about/loving_code/swoole/coroutine/swoole_coroutine.php:23 Stack trace: #0 {main} thrown in /Users/darry/php_about/loving_code/swoole/coroutine/swoole_coroutine.php on line 23 Fatal error: Uncaught Error: Call to undefined method Swoole\Coroutine\Server::handler() in /Users/darry/php_about/loving_code/swoole/coroutine/swoole_coroutine.php:23 Stack trace: #0 {main} thrown in /Users/darry/php_about/loving_code/swoole/coroutine/swoole_coroutine.php on line 23 ``` 代码是tcp 的client端 ``` //Swoole\Runtime::enableCoroutine(); //此行代码后,文件操作,sleep,Mysqli,PDO,streams等都变成异步IO,见'一键协程化'章节 $s = microtime(true); $host = "127.0.0.1"; $port = '9999'; $timeout = 0.5; Swoole\Coroutine::create(function()use ($s,$host,$port,$timeout){ $client = new Swoole\Coroutine\Client(SWOOLE_SOCK_TCP); if(!$client->connect($host,$port,$timeout)){ echo "connect failed . Error : ".$client->errCode.PHP_EOL; }else{ $client->send(date("Y-m-d H:i:s ",$s). " msg :hello world " .PHP_EOL); echo date("Y-m-d H:i:s")." Recive ms : ".$client->recv().PHP_EOL; $client->close(); } }); ``` 解决方案,swoole官方给出的建议, 1. 检查swoole的版本,swoole的协程是在4.4.0+以后才出现的,检查版本可以使用swoole函数```swoole_version()```活着使用命令行```php --ri swoole```查看返回的字符串的```Version```的提示。 2. 如果1的满足,那么查看php是否关闭swoole的短协程名称,请打开即可。 ```swoole.use_shortname=On/Off ```来```开启 / 关闭```短名,默认为```开启```,我关闭了,由于是在```php.ini```中配置, 别的项目需要将这个配置项目关闭,偶尔不考虑打开这个,直接采用第三个解决方案。 3. 使用使用 ```Coroutine::create``` 方法替换 ```Co\Run``` 或 ```go``` 来创建协程; 问题就解决了: 参考文档: 1. ```https://wiki.swoole.com/#/question/use?id=call-to-undefined-function-corun```
swoft 中使用查询构造器表关联查询 作者: lovingyu_er 时间: 2020-05-21 17:10:09 分类: 编程语言,PHP,Swoole-PHP 评论 在使用php swoole 框架进行多表关联查询的时候,发现文档并不是特别的全,故根据自己的需求,写了一个探索文档: ```` DB::table("classes") ->leftJoin("grade", 'classes.grade_id', "=", 'grade.id') ->select("classes.*","grade.grade_name") ->toSql(); ``` 输出的SQL语句是: ``` select `school_classes`.*, `school_grade`.`grade_name` from `school_classes` left join `school_grade` on `school_classes`.`grade_id` = `school_grade`.`id`; ``` 如何增加别名: ``` return DB::table("classes as A") ->leftJoin("grade as B", 'A.grade_id', "=", 'B.id') ->select("A.*","B.grade_name") ->toSql(); ``` 输出的SQL语句是: ``` select `school_A`.*, `school_B`.`grade_name` from `school_classes` as `school_A` left join `school_grade` as `school_B` on `school_A`.`grade_id` = `school_B`.`id` ``` 获取结果: ``` return DB::table("classes as A") ->leftJoin("grade as B", 'A.grade_id', "=", 'B.id') ->select("A.*","B.grade_name") ->get(); ``` 参考文档: 1. ```https://www.swoft.org/documents/v2/mysql/model/``` swoft模型讲解 2. ```https://www.swoft.org/documents/v2/mysql/query/```
php swoole 相关命令行 作者: lovingyu_er 时间: 2020-05-19 15:58:05 分类: 编程语言,PHP,Swoole-PHP 评论 查看本地的swoole的版本信息: ``` php --ri swoole ``` 输出的结果如下: ``` swoole Swoole => enabled Author => Swoole Team Version => 4.5.0 Built => May 4 2020 16:09:47 coroutine => enabled kqueue => enabled rwlock => enabled pcre => enabled zlib => 1.2.11 brotli => E16777223/D16777223 async_redis => enabled Directive => Local Value => Master Value swoole.enable_coroutine => On => On swoole.enable_library => On => On swoole.enable_preemptive_scheduler => Off => Off swoole.display_errors => On => On swoole.use_shortname => Off => Off swoole.unixsock_buffer_size => 262144 => 262144 ```