1. 进程详解;
什么是进程
进程就是正在运行的程序的一个实例
比如在某个终端里执行一个 PHP 脚本,这时候就相当于开启了一个进程,会有对应的一个进程 id
Swoole 会对进程进行一些管理。参考文档
https://wiki.swoole.com/wiki/page/p-process.html
Swoole 里进程和进程之间是通过
管道 来进行通信的。
cd /data/project/test/swoole/demo/
mkdir process
cd process
vim process.php
<?php
$process = new swoole_process ( function ( swoole_process $pro ) {
$pro - > exec ( "/usr/local/php/bin/php" , [ __DIR__ . '/../server/http_server.php' ] ) ;
} , true ) ;
$pid = $process - > start ( ) ;
echo $pid . PHP_EOL ;
swoole_process: : wait ( ) ;
php process.php
7632
netstat -anp | grep 8811
tcp 0 0 0.0.0.0:8811 0.0.0.0:* LISTEN 7632/php
ps -ef | grep process.php
root 7631 3680 0 22:30 pts/1 00:00:00 php process.php
root 7648 4681 0 22:32 pts/2 00:00:00 grep --color= auto process.php
yum -y install psmisc
pstree -p 7631
php( 7631) ───php( 7632) ─┬─php( 7633) ─┬─php( 7635)
│ ├─php( 7636)
│ ├─php( 7637)
│ ├─php( 7638)
│ ├─php( 7639)
│ ├─php( 7640)
│ ├─php( 7641)
│ └─php( 7642)
└─{ php} ( 7634)
ps aft | grep http_server
7632 pts/1 Sl+ 0:00 \_ /usr/xx/php /data/xx/.. /http_server.php
7633 pts/1 S+ 0:00 \_ /usr/xx/php /data/xx/.. /http_server.php
7635 pts/1 S+ 0:00 \_ /usr/xx/php /data/xx/.. /http_server.php
7636 pts/1 S+ 0:00 \_ /usr/xx/php /data/xx/.. /http_server.php
7637 pts/1 S+ 0:00 \_ /usr/xx/php /data/xx/.. /http_server.php
7638 pts/1 S+ 0:00 \_ /usr/xx/php /data/xx/.. /http_server.php
7639 pts/1 S+ 0:00 \_ /usr/xx/php /data/xx/.. /http_server.php
7640 pts/1 S+ 0:00 \_ /usr/xx/php /data/xx/.. /http_server.php
7641 pts/1 S+ 0:00 \_ /usr/xx/php /data/xx/.. /http_server.php
7642 pts/1 S+ 0:00 \_ /usr/xx/php /data/xx/.. /http_server.php
7653 pts/0 S+ 0:00 \_ grep --color= auto http_server.php
2. 进程案例解刨;
背景
有 10 个 URL 地址,需要获取 10 个 URL 内容并且记录到库里去
原始方案:同步顺序执行
问题
执行慢
解决方案
引入 Swoole process
按需开启 N 个子进程执行
cd /data/project/test/swoole/demo/process
vim curl.php
<?php
echo "process-start-time: " . date ( "Ymd H:i:s" ) . PHP_EOL ;
$workers = [ ] ;
$urls = [
'http://baidu.com' ,
'http://sina.com.cn' ,
'http://qq.com' ,
'http://weibo.com' ,
'http://163.com' ,
'http://sohu.com'
] ;
for ( $i = 0 ; $i < 6 ; $i ++ ) {
$process = new swoole_process ( function ( swoole_process $worker ) use ( $i , $urls ) {
$content = curlData ( $urls [ $i ] ) ;
$worker - > write ( $content . PHP_EOL ) ;
} , true ) ;
$pid = $process - > start ( ) ;
$workers [ $pid ] = $process ;
}
foreach ( $workers as $pro ) {
echo $pro - > read ( ) ;
}
function curlData ( $url ) {
sleep ( 1 ) ;
return $url . " is finished" . PHP_EOL ;
}
echo "process-end-time: " . date ( "Ymd H:i:s" ) . PHP_EOL ;
php curl.php
process-start-time: 20190914 17:21:51
http://baidu.com is finished
http://sina.com.cn is finished
http://qq.com is finished
http://weibo.com is finished
http://163.com is finished
http://sohu.com is finished
process-end-time: 20190914 17:21:52
3. 内存 - table 详解;
内存操作模块
Table
Atomic
Lock
Buffer(即将废弃)
mmap(即将废弃)
channel(即将废弃)
seriable(即将废弃)
Table
Swoole_table 是一个基于共享内存和锁实现的超高性能,并发数据结构
可以用 Swoole_table 在内存中去申请一个内存模块,用来管理相关的数据表
Swoole_table 非常精巧,使用也很方便,性能极高,全内存操作、没有系统调用的 IO 开销
单进程每秒进行写操作 300 万 + 次
参考文档:
https://wiki.swoole.com/wiki/page/p-table.html
cd /data/project/test/swoole/demo/
mkdir memory
cd memory
vim table.php
<?php
$table = new swoole_table ( 1024 ) ;
$table - > column ( 'id' , $table : : TYPE_INT , 4 ) ;
$table - > column ( 'name' , $table : : TYPE_STRING , 64 ) ;
$table - > column ( 'age' , $table : : TYPE_INT , 3 ) ;
$table - > create ( ) ;
$table - > set ( 'key1' , [ 'id' = > 1 , 'name' = > 'Jerry' , 'age' = > 30 ] ) ;
print_R ( $table - > get ( 'key1' ) ) ;
php table.php
Array
(
[ id] = > 1
[ name] = > Jerry
[ age] = > 30
)
vim table.php
<?php
$table = new swoole_table ( 1024 ) ;
$table - > column ( 'id' , $table : : TYPE_INT , 4 ) ;
$table - > column ( 'name' , $table : : TYPE_STRING , 64 ) ;
$table - > column ( 'age' , $table : : TYPE_INT , 3 ) ;
$table - > create ( ) ;
$table [ 'key2' ] = [
'id' = > 2 ,
'name' = > 'Jack' ,
'age' = > 31
] ;
print_R ( $table [ 'key2' ] ) ;
$table - > incr ( 'key2' , 'age' , 2 ) ;
echo "incr 2:" . PHP_EOL ;
print_R ( $table [ 'key2' ] ) ;
$table - > decr ( 'key2' , 'age' , 3 ) ;
echo "decr 3:" . PHP_EOL ;
print_R ( $table [ 'key2' ] ) ;
echo "delete start:" . PHP_EOL ;
$table - > del ( 'key2' ) ;
print_r ( $table [ 'key2' ] ) ;
php table.php
Swoole\Table\Row Object
(
[ key] = > key2
[ value] = > Array
(
[ id] = > 2
[ name] = > Jack
[ age] = > 31
)
)
incr 2:
Swoole\Table\Row Object
(
[ key] = > key2
[ value] = > Array
(
[ id] = > 2
[ name] = > Jack
[ age] = > 33
)
)
decr 3:
Swoole\Table\Row Object
(
[ key] = > key2
[ value] = > Array
(
[ id] = > 2
[ name] = > Jack
[ age] = > 30
)
)
delete start:
Swoole\Table\Row Object
(
[ key] = > key2
[ value] = > Array
(
)
)
4. 协程。
介绍
Swoole 内置了协程的能力
参考文档:
https://wiki.swoole.com/wiki/page/p-coroutine.html
开发者可以无感知的用
同步的代码编写 方式达到
异步 IO 的效果和性能 ,避免了传统异步回调所带来的离散的代码逻辑和陷入多层回调中导致代码无法维护
相关资料
线程、进程、协程的区别
进程、线程、协程与并行、并发
并发与并行的区别
cd /data/project/test/swoole/demo/
mkdir coroutine
cd coroutine
vim redis.php
<?php
$http = new swoole_http_server ( '0.0.0.0' , 8001 ) ;
$http - > on ( 'request' , function ( $request , $response ) {
$redis = new Swoole\ Coroutine\ Redis ( ) ;
$redis - > connect ( '127.0.0.1' , 6379 ) ;
$redis - > auth ( 'asdf' ) ;
$value = $redis - > get ( $request - > get [ 'key' ] ) ;
$response - > header ( "Content-Type" , "text/plain" ) ;
$response - > end ( $value ) ;
} ) ;
$http - > start ( ) ;
php redis.php
<?php
go ( function ( ) {
co: : sleep ( 1 ) ;
echo "协程1" . PHP_EOL ;
} ) ;
echo "Hello1" . PHP_EOL ;
Swoole\Coroutine : : create ( function ( ) {
echo "协程2" . PHP_EOL ;
} ) ;
Swoole\Runtime : : enableCoroutine ( true ) ;
go ( function ( ) {
$client = new Swoole\ Coroutine\ Client ( SWOOLE_SOCK_TCP ) ;
if ( ! $client - > connect ( '127.0.0.1' , 9501 ) ) {
echo 'fail:' . $client - > errCode . PHP_EOL ;
} else {
$client - > send ( "send message" . PHP_EOL ) ;
echo $client - > recv ( ) ;
$client - > close ( ) ;
}
} ) ;
php . . / server/ tcp. php
php a. php