当前位置:首页 > PHP > 正文内容

从0到1搭建TP5.1+Swoole3.5.15环境

phpmianshi2年前 (2018-12-02)PHP27


安装


首先按照Swoole官网说明安装swoole扩展,推荐新手可以直接使用


pecl install swoole


#会安装最新的稳定版(截至本文发布最新版本是4.0.3版本)

或者源码安装:

git clone https://github.com/swoole/swoole-src.git && \
cd swoole-src && \
phpize && \
./configure && \
make && sudo make install


常见问题

问题一:

安装时提示gcc版本过低,可以安装最新的gcc,我安装了4.8.2的

问题二:

这时候安装还是报错,提示gcc版本过低,这时候我注释了 swoole_config.h中关于gcc的检测

问题三:

安装完成后,重启php-fpm发现报错:/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.18' not found

strings /usr/lib64/libstdc++.so.6 | grep GLIBC

发现确实没有:GLIBCXX_3.4.18

ll  /usr/lib64/libstdc++.so.6

发现连接的确实是个老版本:/usr/lib64/libstdc++.so.6.0.13

找一下最新安装的:find / -name libstdc++.so.6*

我们发现,gcc安装时把/libstdc++.so.6.0.18 安装到了/usr/local/lib64/libstdc++.so.6.0.18下,但并没有改变libstdc++.so.6的链接指向。

那么我们手动来更新软连接

cp /usr/local/lib64/libstdc++.so.6.0.18 /usr/lib64

rm -rf /usr/lib64/libstdc++.so.6

ln -s /usr/lib64/libstdc++.so.6.0.18 /usr/lib64/libstdc++.so.6

strings /usr/lib64/libstdc++.so.6 | grep GLIBC

发现有:GLIBCXX_3.4.18了 再次重新启动,完成



安装完成后,你可能需要在你的php.ini中添加:

extension=swoole.so

因为我是 php5.6的版本,最新的swoole需要php7以上,只能先按照1.x版本了

进入oneinstack安装目录执行下面命令,有当前php版本的swoole安装选项:

./addons.sh


再执行下面:

composer require topthink/think-swoole

配置文件:config/swoole_server.php

启动:

可以支持直接启动一个Swoole server(需要2.0.9+版本)

php think swoole:server

配置文件:config/swoole_server.php


示例


使用自定义的服务类

namespace app\push;

use think\swoole\Server;

class Swoole extends Server
{
    protected $host = '127.0.0.1';
    protected $port = 9502;
    protected $option = [
        'worker_num' => 4,
        'daemonize' => true,
        'backlog' => 128
    ];

    public function onReceive($server, $fd, $from_id, $data)
    {
        $server->send($fd, 'Swoole: ' . $data);
    }
}

在swoole_server.php中增加配置参数

'swoole_class' => 'app\push\Swoole', // 自定义服务类名称


定义该参数后,其它配置参数均不再有效。


客户端测试代码:

<!DOCTYPE HTML>

<html>

<head>

    <meta charset="utf-8">

    <title>socket test</title>

    <script>

        function msg(txt){

            var para=document.createElement("p");

            var node=document.createTextNode(txt);

            para.appendChild(node);

            var element=document.getElementById("div");

            element.appendChild(para);

        }

        // 打开一个 web socket

        var ws = new WebSocket("ws://123.207.9.205:20000");

        var div = document.getElementById("div");

        ws.onopen = function()

        {

            // Web Socket 已连接上,使用 send() 方法发送数据

            ws.send("send msg");

            msg("send msg");

        };

        ws.onmessage = function (evt)

        {

            var received_msg = evt.data;

            msg("rev "+received_msg);

        };

        ws.onclose = function()

        {

            // 关闭 websocket

            msg("close ");

        };

    </script>

</head>

<body>

<div id="div">

</div>

</body>

</html>


版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

laravel中设置数据库读写分离后强制使用主库查询

背景在项目比较火爆,QPS比较高时,可以设置读写分离来扩容数据库,减少数据库的压力,但是有些业务可能对数据一致性要求比较高,比如支付。当支付成功时,再去查询订单状态时,如果查询走的从库,如果出现主从延...

Windows下nginx+fastcgi+php的并发阻塞问题

同事接到一个需求,需要调用同一个项目的另一个接口,于是CURL调用接口。代码撸完了,本地测试一下 浏览器一直转圈圈直到超时…… 百思不得其解主要是windows+nginx开发环境遇到的问题,本人很少...

php-fpm backlog参数优化

php-fpm backlog参数优化

一、问题分析       1、分析php-fpm.slow.log发现没有执行慢的地方,然后把目光放到了nginx 与php建立连接的阶段上,使用tcpdump...

PHP中跨域原理以及解决方案

1.为啥出现跨域在制定Html规则时,为了安全的考虑,一个源的脚本(网页,网站)不能与另一个源的资源进行交互,所以就引发一个词叫做“同源策略”。所谓同源(即指在同一个域),就是两个页面具有相同的协议(...

PHP中max_execution_time设置不生效

问题描述:max_execution_time设置了1秒,但是发现超过3秒的脚本还是跑。于是深入研究下max_execution_time不生效的原因。官网描述:https://www.php.net...

DAL、DAO、ORM、Active Record详解

模型 Model模型是MVC中的概念,指的是读取数据和改变数据的操作(业务逻辑)。一开始我们直接把和数据库相关的代码放在模型里(sql直接写在代码中),这样就会导致以后的维护相当麻烦。业务逻辑的修改都...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。