# macos下使用pecl安装swoole扩展的方法

**URL:** <https://www.shiqidu.com/t/topic/266>\
**Category:** 开发调优\
**Tags:** Swoole\
**Created:** [2017 年11 月 2 日 15:08 UTC](https://www.shiqidu.com/t/topic/266 "2017-11-02T15:08:33Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

作者： ![Leon](https://www.shiqidu.com/user_avatar/www.shiqidu.com/leon/32/5_2.png) [@Leon](https://www.shiqidu.com/u/Leon)\
发布日期： [2017 年11 月 2 日 15:08 UTC](https://www.shiqidu.com/t/topic/266/1 "2017-11-02T15:08:33Z")

</div>

执行`sudo pecl install swoole`

### 可能报错找不到`php.h`

```bash
fatal error: 'php.h' file         
 not found        
 #include "php.h"        
     ^        
1 error generated.        
make: *** [swoole.lo] Error 1        
ERROR: `make’ failed        

```

解决办法

```bash
sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include /usr/include        

```

不要照抄把 **MacOSX10.13.sdk** 换成你自己的macos版本

### 可能报错没有操作权限

```bash
Operation not permitted        

```

这个是macos新版本中的引入了\*\* Rootless\*\*策略，我们会对一些系统的目录没有操作的权限，即使是root用户也不行（一定是个假root）。

暂时关闭的方法是_ **关机重启** 后按住__command + R_\*别送，进入安全模式。  
在安全模式下打开终端，输入下面命令后重新启动即可

```bash
csrutil disable        

```

开启的办法也很简单

```bash
csrutil enable        

```

关闭后在执行`sudo pecl install swoole`命令，等待安装完成，这下应该就没有什么问题了。

```bash
Build process completed successfully        
Installing '/usr/lib/php/extensions/no-debug-non-zts-20160303/swoole.so'        
install ok: channel://pecl.php.net/swoole-1.9.22        
configuration option "php_ini" is not set to php.ini location        
You should add "extension=swoole.so" to php.ini        

```

看到Success应该安装成功了，然后把`extension=swoole.so`这行代码添加到`php.ini`文件中即可。

### 让我们来测试下swoole能不能用

在你的htdocs目录下新建`swoole_server.php`，输入下边的代码

```php
//创建Server对象，监听 127.0.0.1:9501端口      
$serv = new swoole_server("127.0.0.1", 9501);       
      
//监听连接进入事件      
$serv->on('connect', function ($serv, $fd) {        
    echo "Client: Connect.\n";      
});      
      
//监听数据接收事件      
$serv->on('receive', function ($serv, $fd, $from_id, $data) {      
    $serv->send($fd, "Server: ".$data);      
});      
      
//监听连接关闭事件      
$serv->on('close', function ($serv, $fd) {      
    echo "Client: Close.\n";      
});      
      
//启动服务器      
$serv->start();      

```

`cmd+x`保存退出

然后执行脚本

```bash
swoole_server.php      

```

执行完毕后应该没有反应，linux里没有反应就是没啥毛病。

然后新打开一个窗口执行`telnet 127.0.0.1 9501`，然后坑又来了，报错`command not found`，为啥呢？

因为苹果爸爸在macos 10.13版本中移除了`telnet`命令，当然你可以通过brew安装回来。但是既然苹果爸爸不建议你用那就不用了呗，我们可以用下面的命令代替。

```bash
curl -v telnet://127.0.0.1:9501      

```

在连接成功后，我们输入`hello`。

![2432e3f33fe94f23b32aed0fb2281f3b.png](https://discourse.shiqidu.com/uploads_nj/article/20171102/2432e3f33fe94f23b32aed0fb2281f3b.png)  
ok啦！

* * *

如果运行`php swoole-server.php`后告诉你端口号被占用，我们需要查出占用端口的进程，杀掉即可。

`sudo lsof -i :9000 ``kill -9 端口号`

---

<div class="post-metadata">

作者： ![Leon](https://www.shiqidu.com/user_avatar/www.shiqidu.com/leon/32/5_2.png) [@Leon](https://www.shiqidu.com/u/Leon)\
发布日期： [2017 年11 月 10 日 09:01 UTC](https://www.shiqidu.com/t/topic/266/2 "2017-11-10T09:01:46Z")

</div>

安装pecl的方法

```bash
yum install php-pear  

```
