云溪的 blog
  • Archive
  • Media
  • Search
  • Tags
  • About
Home » Tags

Php

Laravel docker compose 部署方案介绍

最近在公司搭建最新版本的 Laravel 开发环境,对 docker 部署进行了进一步的优化,我们之前的项目是把定时任务 Cron 和 API 在同一个容器里启动的,这显然不太符合容器的最佳实践,借着这次框架搭建的契机,我决定优化一下这个问题。 环境如下: Laravel : 12 PHP : 8. 4 我们把项目跑在两个容器里,一个是 API 的容器,另一个是 Supervisor 的容器,把 Cron 和 Jobs 放在放在 Supervisor 里执行。 这样就能避免维护过多的容器。在后期做 CI/CD 也会更加方便。 Supervisor 使用和 PHP 一样的 Dockerfile 因为 Supervisor 会用到 PHP 环境来起 Laravel 的 Jobs。 整体方案就是这样来做的,比较简单, 文末我会放一个 git 仓库地址,感兴趣的可以可以进一步了解,接下来讲讲一些细节。 Cron 的配置我们放在了 Dockerfile 里来配置,当然你也可以放在 entrypoint.sh 里来做。 RUN echo "* * * * * /usr/local/bin/php /var/www/artisan schedule:run >> /var/log/cron.log 2>&1" | crontab - 我们的 docker compose 配置如下: ...

June 25, 2025 · 1 min · 云溪

如何构建 php-fpm 镜像

在实际的项目部署中,我们有时候会遇到在一个服务器上部署多个 php 环境的情况。遇到这种情况,我们可以在同一物理机上装多个 php-fpm 监听不同端口,Nginx 根据不同的 Vhost 去找不同的 php-fpm 解析。 上述方法虽然可以,但是在项目管理上并不是很友好,比如我需要在某个项目执行 PHP 脚本,那还需要写 /path/php script.php 这样的话就需要每个维护项目的人都十分清楚,哪个项目应该用哪个版本的 PHP 去执行相应的脚本。 其次,如果某天需要把某个项目迁移到其他服务器了,我们还需要在新机器上安装 PHP 环境。 如果用 docker 进行部署,就不会有上面的问题,我们只需要写一次 Dockfile 可以在任何服务器上构建出相同的 php-fpm 环境,从而让迁移更简单,如果需要执行脚本,只需要进入对应的容器,直接执行 php script.php 即可。 php-fpm 官方镜像介绍 在 [php Tags | Docker Hub](https://hub.docker.com/_/php/tags 找到你所需的基础镜像的 tag 扩展安装 Docker PHP 安装有三种方式 Core Extensions: FROM php:8.2-fpm RUN apt-get update && apt-get install -y \ libfreetype-dev \ libjpeg62-turbo-dev \ libpng-dev \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) gd PECL extensions : ...

November 17, 2023 · 2 min · 云溪

golang base64 编码与 PHP 输出不一致

最近开发中,将一个 php 算法,移植到 golang 中,发现 base64 算法生成的字符串不一致,经过排查发现是由于 ASCII 控制字符导致的原因,加下来看代码 <?php $asciiArr =[10, 187, 217, 12, 207, 183, 184, 231, 184, 149, 118, 151]; $str = ''; foreach ($asciiArr as $ascii) { $str .= chr($ascii); } echo base64_encode($str); 上述代码输出: CrvZDM+3uOe4lXaX package main import ( "encoding/base64" "fmt" ) func main() { res := []int{10, 187, 217, 12, 207, 183, 184, 231, 184, 149, 118, 151} var str string var b []byte for _, v := range res { str += string(v) b = append(b, byte(v)) } byteCode := base64.StdEncoding.EncodeToString([]byte(b)) strCode := base64.StdEncoding.EncodeToString([]byte(str)) fmt.Println("byteCode:", byteCode) fmt.Println("stringCode:", strCode) } 上述代码输出: byteCode: CrvZDM+3uOe4lXaX stringCode: CsK7w5kMw4/Ct8K4w6fCuMKVdsKX 由此可以看出,关于 ASCII 控制字符的转码,不可以用 string 转 byte 到 EncodeToString 方法,如果需要一致输出,需要直接用 []byte 接收值传入 EncodeToString 即可

June 16, 2021 · 1 min · 云溪

Composer 私有仓库搭建

Composer 是 PHP 的软件包管理系统,它提供用于管理 PHP 软件和依赖库关系的标准格式。作为日常开发,Composer 能够满足我们的日常需求,但有些情况下,我们有些公司内部的扩展,不希望被检索或者放在共有库中,就需要搭建私有库来解决问题。 在讨论搭建私有仓库前,我们先了解一下 Composer 是如何安装扩展的 Composer 安装扩展流程 通过上图我们不难发现,如果要构建私有仓库,我们需要构建一个类似 Packagist 的网站,来告诉 Composer 该从哪里下载扩展代码,这就需要用到 Satis 工具 Satis 介绍 Satis 是一个开源的静态 Composer 仓库生成器,有了它我们可以轻松的构建出一个类似 Packagist 的索引网站,来告诉 Composer 通过我们自己的私有仓库下载扩展。 安装 命令行安装 // 安装 composer create-project composer/satis:dev-main // 构建索引仓库 php bin/satis build <configuration-file> <output-directory> docker 安装 下载镜像: docker pull composer/satis 运行镜像: docker run --rm --init -it \ --user $(id -u):$(id -g) \ --volume $(pwd):/build \ --volume "${COMPOSER_HOME:-$HOME/.composer}:/composer" \ composer/satis build <configuration-file> <output-directory> 配置 创建一个名为:satis.json 的配置文件。 内容如下: ...

April 1, 2021 · 1 min · 云溪

PHP-FFMpeg 安装

安装 FFMPEG wget http://download.bt.cn/install/ext/ffmpeg.sh && sh ffmpeg.sh 安装完后可输入以下命令是否安装成功 ffmpeg -version 删除禁用函数 proc_open, exec, system 安装 PHP-FFMpeg composer require php-ffmpeg/php-ffmpeg 常见问题 Executable not found, proposed : avprobe, ffprobe php-fpm 在执行 FFMPEG 的时候,没有找到 ffprobe 和 ffmpeg 解决办法如下: 命令行解决 通过 shell 确定文件位置 whereis ffprobe /usr/local/bin/ffprobe which ffmpeg /usr/local/bin/ffmpeg 在初始化 FFMpeg 的时候将文件位置写入 $ffmpeg = FFMpeg::create([ 'ffmpeg.binaries' => '/usr/local/bin/ffmpeg', 'ffprobe.binaries' => '/usr/local/bin/ffprobe', ]); PHP 代码直接解决 // 写入 WWW 用户的环境变量 putenv('PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:$PATH'); // 通过 exec 函数找到文件对应位置 $ffmpeg = FFMpeg::create([ 'ffmpeg.binaries' => exec('which ffmpeg'), 'ffprobe.binaries' => exec('which ffprobe'), ]); 虽然看似两种办法,其实解决思路是一致的,都是要指定 ffmpeg 和 ffprobe 文件的位置。理论上直接在服务器上将 www 用户的环境变量加入 ffmpeg 和 ffprobe 也可以解决此问题(没有测试,不保证有效,有兴趣的可以自行验证)。 ...

August 28, 2020 · 1 min · 云溪
Next  »
© 2025 云溪的 blog