从php源码中补充编译安装GD模块扩展的一些问题

2024-08-24 06:38

本文主要是介绍从php源码中补充编译安装GD模块扩展的一些问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上篇博客,主要写了关于日志服务器的搭建。

centos+rsyslog+mysql+loganalyzer搭建日志服务器_大橘子的博客-CSDN博客

其中loganalyzer界面需要图表,于是才需要安装gd模块。可以先尝试yum安装gd,然后php当中调用它。我这个因为版本不兼容,所以只好定制安装。

按照网上大神的说法,需要这些依赖:jpeg,libpng,freetype,zlib。这些东西都可以单独在官网下载源码。网址如下:

jpeg:http://www.ijg.org/

libpng:http://www.libpng.org/

freetype:https://freetype.org/

zlib:http://www.zlib.net/

我用的php是之前搭建lamp时编译安装的php5.6。之前的两个博客详细提到过。

mariadb10.5.13+php5.6.40,解决/tmp/mysql.sock_大橘子的博客-CSDN博客

apache和php的两种组合方式,module和fpm_大橘子的博客-CSDN博客

当时选择php5.6的意图,在于系统环境是centos6,如果下载最新的php8,首先要求libxml2-2.9,而且还不止这个问题,不想无限延伸,所以就选了老些的版本。

这一次我也一样有类似尝试。我选择的各版本分别是:jpeg9e(最新),libpng1.6.37(最新),freetype2.5.0(折中),zlib和gd都是php源码包中带了模块源码,只是默认不编译。

其中freetype使用最新版本时,php5.6自带的gd编译不通过,又不想用最新php8,所以只好妥协freetype。

下面是重要过程记录:

回顾php:

php-mod方式:

 ./configure --prefix=/usr/local/php-mod --sysconf=/usr/local/php-mod/conf --with-config-file-path=/usr/local/php-mod/conf --with-config-file-scan-dir=/usr/local/php-mod/conf.d --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-openssl --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockets --with-mcrypt --with-bz2 --with-apxs2=/usr/local/apache/bin/apxs --enable-maintainer-zts

php-fpm方式:

./configure --prefix=/usr/local/php-fpm --sysconf=/usr/local/php-fpm/conf --with-config-file-path=/usr/local/php-fpm/conf --with-config-file-scan-dir=/usr/local/php-fpm/conf.d --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-openssl --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockets --with-mcrypt --with-bz2 --enable-fpm

我两种都装了,为的就是灵活。配置文件路径尽量避开系统默认位置。

apache我装在了/usr/local/apache,配置文件路径/usr/local/apache/conf,一定要避开系统默认位置。个人习惯而已,将来不用了直接删除,简单。

jpeg和libpng:

        ./configure --prefix=/usr/local/jpeg --enable-shared
        make -j 4 && make install            
        ./configure --prefix=/usr/local/libpng --enable-shared
        make -j 4 && make install

        过程简单没特别说明的。

        有些源码中直接有configure,有些有autogen.sh,可以自动执行configure,但是有些需要在脚本中设置路径。具体一看便知。

freetype2.6:

 正常执行configure时报错:

checking for libpng... which: no libpng-config in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)
configure: error: `libpng-config' not found;
either set the LIBPNG_CFLAGS and LIBPNG_LDFLAGS environment variables,
or pass `--without-png' to the `configure' script.
make: *** [setup] Error 1

开始我天真地以为,加上--with-png=/usr/local/libpng就可以了,而且理论上这是可以满足要求的,因为libpng的安装目录结构完好,其bin目录下确实有libpng-config,咋就不行了?而且--with-png这个参数也不是瞎给的,给错会提示。

我注意到它搜索的路径其实是path环境变量,但是我的习惯是,临时用一下不值得去修改一些固定的东西。所以我使用了():

(PATH=$PATH:/usr/local/libpng/bin;./configure --prefix=/usr/local/freetype --enable-shared)
make -j 4 && make install

括号里临时执行一下即可,然后编译成功。

zlib和gd:

这两个在php源码目录中可以找到,分别在ext/zlib和ext/gd。这种属于补充编译。我以为和编译内核似的可以使用M=,但是不行的。应该这样:

首先进入到模块源码目录,这时候里面没有configure。

其次需要以这个目录为当前目录,调用执行phpzie程序,比如:/usr/local/php-mod/bin/phpize。这个没有一定,看php程序在什么地方了 ,上面是我编译安装php的位置。

我编译zlib时遇到它报错了,因为没找到config.m4文件,但是有个config0.m4,很简单,复制或者重命名一个就行了。

然后phpize会在当前目录下生成configure以及相关编译工具文件。然后就正常编译:

gd:

./configure --with-php-config=/usr/local/php-mod/bin/php-config --with-jpeg-dir=/usr/local/jpeg/ --with-png-dir=/usr/local/libpng/ --with-freetype-dir=/usr/local/freetype/ 
make -j 4 && make install            

zlib:
./configure --with-php-config=/usr/local/php-mod/bin/php-config
make -j 4 && make install 

有些参数,开始不知道可以什么都不加,如果需要它会报错的。一看错误信息就知道了。编译安装完成后,它会生成模块文件,并放在php程序的扩展目录:

/usr/local/php-mod/lib/php/extensions/no-debug-zts-20131226

只要在这个目录下,php.ini当中就可以直接指定相对路径的。比如这样:

extension=zlib.so(这一项我试过,没有也行)
extension=gd.so
但是文件中的说明一定要看好,很多dll那种是给windows用的,linux上也没那些dll。

提醒:

上面做了这么多,我是以php-mod为例说明的,如果也装了php-fpm,一定要看好了到底用的是哪个,apache配置文件记着做好。我的习惯,不喜欢总修改原有的,所以httpd.conf的尾部我加了:

# php
Include conf/extra/httpd-php.conf

并且注释掉原有的php模块引用。

#LoadModule php5_module        modules/libphp5.so
然后在httpd-php.conf子文件中写:


#php-fpm option
#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so#ProxyRequests Off
#ProxyPassMatch ^/(.*\.php)$  fcgi://127.0.0.1:9000/a_html/$1#php-mod option
LoadModule php5_module        modules/libphp5.so#php-common option
<IfModule dir_module>DirectoryIndex index.php index.html
</IfModule>
<IfModule mime_module>AddType application/x-httpd-php .phpAddType application/x-httpd-php-source .phps
</IfModule>
~                                                                                                                                                                           
~                                                                                                                                                                           
~                                          

这样,配置文件也是模块化的,修改方便。

当然,我在php-fpm模式下也测试过了,没问题。但是千万别偷懒,zlib和gd模块是需要重新编译成php-fpm模式的,--with-php-config选项指定相应位置即可。

其实熟悉了以后,操作非常快,主要是知道原理。

测试:

一切就绪后重启httpd服务,然后打开phpinfo页面查看。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aSn5qmY,size_20,color_FFFFFF,t_70,g_se,x_16

 可以看到有了gd内容,都是enabled。

再看loganalyzer的statistics页面,图表也出来了,很美观。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aSn5qmY,size_20,color_FFFFFF,t_70,g_se,x_16

至此完成。

每次操作,程序方面我都尽量选新版本。为了考虑centos6的兼容,所以php和freetype都相应降级,而其它程序我都选择了最新,比如mariadb ,jpeg,libpng,discuz,phpmyadmin,wordpress等。每次遇到问题,解决问题的过程才是成长的过程。

本文完。

这篇关于从php源码中补充编译安装GD模块扩展的一些问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101736

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境