在 docker 容器中安装 zend guard
发表于|更新于|码不能停
|总字数:112|阅读时长:1分钟|浏览量:
在 docker 容器中安装 zend guard。
进入容器
1 | docker-compose exec php-fpm bash |
更新环境
1 | apt-get update |
下载文件
1 | wget http://downloads.zend.com/guard/7.0.0/zend-loader-php5.6-linux-x86_64_update1.tar.gz |
解压
1 | tar -xzvf zend-loader-php5.6-linux-x86_64_update1.tar.gz |
查看扩展路径
在 php-info 中搜索路径:
1 | extension_dir |

移动扩展包并使之生效
1 | cp *.so /usr/local/lib/php/extensions/no-debug-non-zts-20131226 |
安装成功
重启环境。
文章作者: m-finder
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 M-finder!
相关推荐

2018-03-27
Docker安装教程
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。 docker官方推荐了两种安装方式:app和toolbox。 注:app方式对系统版本和配置会有一定要求,Mac版本会自动为你安装好VM(虚拟机),但Windows版本需要你安装微软虚拟化产品Hyper-V,而toolbox方式则需要你额外安装virtualbox来作为docker的VM。 App-macApp-win Toolbox centos 安装注意:docker要求centos在3.0以上 可以用 uname -r 查看centos内核: 12345uname -r[root@localhost ~]# uname -r2.6.32-696.20.1.el6.x86_64 好可惜,我的虚拟机不支持,升级个内核再继续装。 Docker 软件包和依赖包已经包含在默认的 CentOS-Extras 软件源里,安装命令如下: 1yum -y install docker 如果出现 No package docker availableyum没有找到docker包,更新epel第三方软件库,运行命令: 1sudo yum install epel-release 然后再运行: 1sudo yum install docker-io 安装完就可以愉快地安装了。 docker 启动启动docker: 1service docker start 测试运行 hello-world 1docker run hello-world 由于本地没有hello-world这个镜像,所以会下载一个hello-world的镜像,并在容器内运行。 windows安装注意:win7,8和10的家庭版需要docker toolbox安装 点我下载: 安装完成后,桌面会多这三个图标出来。强行给我乔巴照相,哈哈! 点击 Docker QuickStart 图标来启动 Docker Toolbox 终端。 如果系统显示 User Account Control 窗口来运行 VirtualBox 修改你的电脑,选择 Yes 输入一下命令调用测试: 1docker run hello-world win10专业版win10专业版自带hyper-v,用来装docker更方便。(hyper-v是win系统自带的一个虚拟机工具) 找到程序和功能,打开启用和关闭功能,然后勾选hyper-v 然后下载安装 Toolbox 安装完成后会自动打开,右下角的系统通知栏有个小鲸鱼的图标,这表示docker在运行。 到这里就安装好了,更多姿势我们可以在启动器输入 docker 来解锁。

2019-04-09
laravel 队列学习
学习下 laravel 的队列系统。 队列的目的是将耗时的任务延时处理,比如发送邮件,从而大幅度缩短 Web 请求和相应的时间。 常用的队列后台有: Beanstalk,Amazon SQS,Redis 等。 配置laravel 为多种队列服务做了统一的API,在配置文件 config/queue.php 中可以找到每种队列驱动的配置。 其中每种驱动都有一个默认的 queue 属性,用来存放使用时没有显示定义队列的任务。 12345// 分发到默认队列Job::dispatch();// 分发到 emails 队列Job::dispatch()->onQueue('emails'); 在项目的配置文件中,可以指定驱动,老版本中为 QUEUE_DRIVER,新版本中为QUEUE_CONNECTION , 驱动默认为 sync,这是一个本地的同步驱动,方便调试队列里的任务。 先以 redis 为例做一个邮件发送队列。 因为 laravel 的 redis 默认使用了 predis,所以先装下扩展: 1composer require 'predis/predis' 邮件配置,最后两项是手动添加的,否则会报错: 12345678MAIL_DRIVER=smtpMAIL_HOST=smtp.mxhichina.comMAIL_PORT=25MAIL_USERNAME=m@m-finder.comMAIL_PASSWORD=xxxxxxMAIL_ENCRYPTION=nullMAIL_FROM_NAME=M-finderMAIL_FROM_ADDRESS=m@m-finder.com 生成任务类命令行执行:php artisan make:job EmailJob,该命令会在 app/jobs 下自动创建文件。 在任务类中发送邮件: 12345678public function handle() { $email = $this->email; $content = '这是一封来自Laravel的队列测试邮件.'; Mail::raw($content, function ($message) use ($email) { $message->subject('[ 测试 ] 测试邮件SendMail - ' . date('Y-m-d H:i:s')); $message->to($email); });} 任务调度之前弄了登录事件和监听,就在监听里去触发吧。 1EmailJob::dispatch($guard->user)->onQueue('emails'); 开启队列1php artisan queue:work --tries=3 --timeout=30 --queue=emails 然后重新登录触发任务。可以看到邮箱已经有了提示: 邮件已经成功发出,接下来就可以在实际的需求中使用了。

2018-04-10
Docker使用教程-以Dockerfile定制镜像
我们都知道,操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。 而 Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu 16.04 最小系统的 root 文件系统。 Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。 理解镜像构成镜像是容器的基础,每次执行 docker run 的时候都会指定以哪个镜像作为容器运行的基础。 镜像是多层存储,每一层是在前一层的基础上进行的修改;而容器同样也是多层存储,是在以镜像为基础层,在其基础上加一层作为容器运行时的存储层。 现在让我们以定制一个 Web 服务器为例子,来讲解镜像是如何构建的。 1docker run --name webserver -d -p 80:80 nginx 这条命令会用 nginx 镜像启动一个容器,该容器命名为 webserver,并且映射了宿主机的 80 端口,这样我们就可以在宿主机用浏览器去访问这个 nginx 服务器。docker的启动画面中有当前容器的 ip,例如:192.168.99.100,打开浏览器直接访问该 ip 就能看到默认的 Nginx 欢迎页面。 现在,我们来做点尝试,修改下nginx的欢迎页面。 1234$ docker exec -it webserver bashroot@bcd5b7c85e68:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.htmlroot@bcd5b7c85e68:/# exitexit 我们以交互式终端方式进入 webserver 容器,并执行了 bash 命令,也就是获得一个可操作的 Shell。 然后,我们用 Hello, Docker! 覆盖了 /usr/share/nginx/html/index.html 的内容。 现在我们再刷新浏览器的话,会发现内容被改变了。 我们修改了容器的文件,也就是改动了容器的存储层。要保存这些修改,可以使用 docker 提供的 docker commit 命令将存储层保存下来成为新的镜像。也就是说,是在原有镜像的基础上,再叠加上改动了的存储层并构成新的镜像。 这意味着每一次修改都会让存储层叠加,而且你所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到。 想想就是件很恐怖的事情。😰 不过,存在即是真理,commit 虽然恐怖,但还是很有用武之地的,比如被入侵后保存现场和一些特殊场合。 使用 Dockerfile 定制镜像如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建和定制镜像,那么之前提及透明性和体积臃肿的问题就都会解决。 这个脚本就是 Dockerfile。 Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。 还是以上边的 nginx 为例。 创建一个文件夹,然后在文件夹内创建一个文本文件。 123mkdir /c/dockercd /c/dockertouch Dockerfile 其内容为: 12FROM nginxRUN echo '<h1>Hello, M-finder!</h1>' > /usr/share/nginx/html/index.html FROM 指定基础镜像所谓定制镜像,就是以一个镜像为基础,在其上进行定制。就像我们先运行了一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指定的。 FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。 RUN 执行命令RUN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。其格式有两种: shell 格式:RUN <命令>,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN 指令就是这种格式。 1RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html run 命令应尽可能的压缩为一行,因为每一个 run 命令就是一层存储层,而且,命令应该遵循良好的代码格式,比如换行、缩进、注释等,会让维护、排障更为容易,最后也应该添加清理工作的命令。 构建镜像在 Dockerfile 文件所在目录执行: 1234567891011$ docker build -t nginx:v3 .Sending build context to Docker daemon 2.56kBStep 1/2 : FROM nginx ---> c5c4e8fa2cf7Step 2/2 : RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html ---> Running in 4e2f0f98fbfeRemoving intermediate container 4e2f0f98fbfe ---> 8b70819a7261Successfully built 8b70819a7261Successfully tagged nginx:v3SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories. 从命令的输出结果中,我们可以清晰的看到镜像的构建过程。在 Step 2 中,如同我们之前所说的那样,RUN 指令启动了一个容器 4e2f0f98fbfe,执行了所要求的命令,并最后提交了这一层 c5c4e8fa2cf7,随后删除了所用到的这个容器 4e2f0f98fbfe。 这里我们使用了 docker build 命令进行镜像构建。其格式为: docker build [选项] <上下文路径/URL/->在这里我们指定了最终镜像的名称 -t nginx:v3,构建成功后,我们可以像之前运行 nginx 那样来运行这个镜像。

2019-03-21
laradock 中 php5.6 连接 mysql 报错解决
laradock 中 php 5.6 连接 mysql 报错的解决方法。 之前弄的是默认版本的 php 7.2 和 mysql 8,配置好以后一直都能正常使用。 最近因为需要切换 php 版本,突然发现切换后连接 mysql 时无法识别 host。 emmmm……,最开始还以为是 php 的锅,各种重新 build,无果,最后在 github 上找到别人发出来的解决办法: rm -rf ~/.laradock/data/mysql删除老版本的数据 docker-compose build mysql重新构建 mysql 进入 mysql 容器mysql -uroot -prootALTER USER root IDENTIFIED WITH mysql_native_password BY ‘root’;exit; 到这里也就可以了。 有这个问题是因为 8 和 5.7 的配置不一样,不清掉老数据的话会引起报错,一有请求去连接 mysql 马上就宕机。

2019-07-31
docker 容器访问宿主机端口
运行在 docker 容器中的一个项目需要访问宿主机的某个端口,比如容器 A 中的项目访问宿主机 B,在 A 的项目中以下边的地址来访问即可: 1host.docker.internal 之前是可以运行的,但是今天不知道什么情况突然 500 了,重启电脑后,在容器中 ping 这个地址: 1234567PING host.docker.internal (192.168.65.2) 56(84) bytes of data.64 bytes from 192.168.65.2: icmp_seq=1 ttl=37 time=2.09 ms64 bytes from 192.168.65.2: icmp_seq=2 ttl=37 time=1.05 ms64 bytes from 192.168.65.2: icmp_seq=3 ttl=37 time=1.05 ms64 bytes from 192.168.65.2: icmp_seq=4 ttl=37 time=1.16 ms64 bytes from 192.168.65.2: icmp_seq=5 ttl=37 time=1.03 ms 可以看到实际访问的是 192.168.65.2 这个地址,那么在宿主机的 host 加上一行: 1192.168.65.2 host.docker.internal 再次访问,ok!做个记录,防止下次再忘。 安装ping不指定用户进入容器,然后执行: 12apt-get updateapt-get install iputils-ping

2019-10-12
在 laradock 环境中使用 laravel-swoole 的 websocket
之前写了一篇 在 laradock 环境中使用 laravel-swoole 加速你的 laravel 应用 的博客,算是敲开了 laravel-swoole 的大门,今天就继续研究下期中的 websocket 功能。 安装 laravel-swoole这里就不写了,参考上篇。 配置 socket编辑 laravel env 文件,写入如下一行: 1SWOOLE_HTTP_WEBSOCKET=true 然后执行 php artisan swoole:http infos 查看状态 1234567891011121314151617+-----------------+-----------------------------------------------------+| Name | Value |+-----------------+-----------------------------------------------------+| PHP Version | 7.2.21-1+ubuntu16.04.1+deb.sury.org+1 || Swoole Version | 4.4.4 || Laravel Version | 5.8.33 || Listen IP | workspace || Listen Port | 1215 || Server Status | Online || Reactor Num | 2 || Worker Num | 2 || Task Worker Num | 2 || Websocket Mode | On || Master PID | 326 || Manager PID | 327 || Log Path | /var/www/laravel-learn/storage/logs/swoole_http.log |+-----------------+-----------------------------------------------------+ 可以看到 Websocket Mode 一项已经打开了。 编辑 socket 路由在 routes/websocket.php 中: 1234567891011121314Websocket::on('connect', function ($websocket, Request $request) { // called while socket on connect $websocket->emit('message', 'welcome');});Websocket::on('disconnect', function ($websocket) { // called while socket on disconnect $websocket->emit('message', 'server is gone, bye~');});Websocket::on('example', function ($websocket, $data) { $websocket->emit('message', $data);}); 此文件修改后需要重启 swoole:http。 前端连接 socket因为 laravel-swoole 使用的是 Socket.io,所以这里也采用这个。 12345678910111213141516<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.1.1/socket.io.js"></script><script type="text/javascript"> var socket = io('http://study.test:8080/', {transports: ['websocket'], reconnection: true}); socket.on('connect', function () { socket.emit('example', 'hi'); socket.on('disconnect', function () { console.log('disconnect'); }); socket.on('message', function (msg) { console.log(msg) }); });</script> 配置 nginx如果你用的 swoole 版本为 4.4.4,那么还需要对上篇文章中的 nginx 配置做个小修改,即添加一行: 1proxy_http_version 1.1; 完整配置就不贴了,把这一行加在 proxy_pass http://swoole-http$suffix; 这一行前后都行。 如果没有这一行的话,而且怎么也没反应的话,记得去 log 中找具体报错。 emmm,文档没写,在 issue 里扒出来的……