从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调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

MySQL Workbench 安装教程(保姆级)

《MySQLWorkbench安装教程(保姆级)》MySQLWorkbench是一款强大的数据库设计和管理工具,本文主要介绍了MySQLWorkbench安装教程,文中通过图文介绍的非常详细,对大... 目录前言:详细步骤:一、检查安装的数据库版本二、在官网下载对应的mysql Workbench版本,要是

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu