引入
小贤贤
Swoole之于PHP正如Node.js之于JavaScript.
韩天峰
PHP的确有很多局限性,比如Unix系统编程、网络通信编程、异步io,Swoole开源项目就是为了弥补PHP在这些方面的缺陷诞生的。Swoole实际上是一个网络通信和异步io的引擎,一个基础库。PHPer可以基于swoole去实现过去PHP无法实现的功能。
More
与Golang/Node.js/Erlang/php+libevent比较,swoole是整体方案。从性能、异步、并行、可维护性、开发效率方面综合考虑的。swoole中你可以同步,也可以异步。代码中可以有阻塞,通过多开进程来调整处理能力。
swoole与phpdaemon/reactphp/workerman等纯PHP网络库的差异
通过压测也能发现,纯C的swoole写一个EchoServer,做-c 500 -n 100000的测试中,CPU始终在5%-10%之间。而PHP实现的PSF网络Server框架,CPU占用率高达70%-90%。
Start
swoole目前已被多家移动互联网、物联网、网络游戏、手机游戏企业使用,替代了C++、Java等复杂编程语言来实现网络服务器程序。 使用PHP+Swoole,开发效率可以大大提升。官方提供了基于swoole扩展开发的PHP网络框架, 支持Http,FastCGI,WebSocket,FTP,SMTP,RPC等网络协议 swoole在美国,英国,法国,印度等国家都有用户分布,在国内的 腾讯、百度、阿里巴巴、YY语音等多家知名互联网公司均有使用。
安装-为PHP添加swoole异步并行扩展 – lianche
sudo apt-get install php7.0
sudo apt-get install php-dev
sudo apt-get install php-pear
sudo pecl install swoole
# 定位 php.ini =>
# find / -name php.ini
# 或者 phpinfo() 中找 load_configuration_file() 对应的内容
# vi /etc/php/php.ini
extension=swoole.so
# client-server 模式
# client
<?php
$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
$client->on("connect", function($cli) {
$cli->send("hello world\n");
});
$client->on("receive", function($cli, $data){
echo "Receive: $data\n";
});
$client->on("error", function($cli){
echo "connect fail\n";
});
$client->on("close", function($cli){
echo "close\n";
});
$client->connect('127.0.0.1', 9501, 0.5);
?>
# server
<?php
$serv = new swoole_server("0.0.0.0", 9501);
$serv->on('connect', function ($serv, $fd){
echo "Client:Connect.\n";
});
$serv->on('receive', function ($serv, $fd, $from_id, $data) {
$serv->send($fd, 'Swoole: '.$data);
});
$serv->on('close', function ($serv, $fd) {
echo "Client: Close.\n";
});
$serv->start();
?>
# 永久定时,循环定时
<?php
$str = "Say ";
$timer_id = swoole_timer_tick( 1000 , function($timer_id , $params) use ($str) {
echo $str . $params; // 输出“Say Hello”
} , "Hello" );
?>
# 临时定时,一次结束
<?php
class Test
{
private $str = "Say Hello";
public function onAfter()
{
echo $this->str; // 输出”Say Hello“
}
}
$test = new Test();
swoole_timer_after(1000, array($test, "onAfter"); // 成员变量
swoole_timer_after(2000, function() use($test){ // 闭包
$test->onAfter(); // 输出”Say Hello“
});
?>
sudo apt-get install git
git clone https://github.com/swoole/framework.git
sudo apt-get install mysql-server mysql-client
sudo apt-get install php7.0-mysql
sudo apt-get install nginx
Ubuntu/CentOS 系统上安装与配置Nginx
1. 服务地址:/etc/init.d/nginx
2. 配置地址:/etc/nginx/ 如:/etc/nginx/nginx.conf
3. Web默认目录:/usr/share/nginx/http/ 如:usr/share/nginx/index.html
4. 日志目录:/var/log/nginx/ 如:/var/log/nginx/access.log
5. 主程序文件:/usr/sbin/nginx
php index.php
运行正常,而在 web 环境下直接访问该网址时,出现 nginx 不解析 php 文件,而是直接下载 php 文件的情况。
测试 nginx.conf
nginx -t -c /etc/nginx/nginx.conf
,出现报错:
2017/03/07 22:29:59 [emerg] 87843#87843: "fastcgi_pass" directive is duplicate in /etc/nginx/sites-enabled/default:57
解决方案:
解决安装nginx 日志文件出现”fastcgi_pass” directive is duplicate 错误
修改 /etc/nginx/sites-available/default,如下:(中间绕了好大的坑–兜兜转转,最后终于知道–文档有多坑。。好端端的项目,为什么文档为什么写成这样?!)
server {
listen 80;
server_name _;
root /var/www/html/test/static;
location / {
if (!-e $request_filename){
proxy_pass http://127.0.0.1:9501;
}
}
}
就是这个地方==。。神坑!是官方改 app_server.php 文件位置了,还是我的理解问题。有毒!
php /var/www/html/test/examples/app_server.php start -d
今天先写到这里。。