搜尋
首頁後端開發php教程制作PHP的RPM包教程

有时候为了方便源码包的安装,我们需要自己订制软件包的需求,我们会把一些源码包按照我们的需求来做成rpm包,当有了源码包就可以直接编译得到二 进制安装包和其他任意包。spec file是制作rpm包最核心的部分,rpm包的制作就是根据spec file来实现的。下面是我以制作php的rpm开始介绍其制作方法。以下操作在CentOS6.6 64位系统进行。

下面我们以制作php的rpm开始介绍其制作方法。以下操作在CentOS6.6 64位系统进行。

安装rpm-build

[root@linuxeye.com SOURCES]# yum -y install rpm-build



建立工作车间目录

[root@linuxeye.com SOURCES]# vim ~/.rpmmacros %_topdir /root/rpmbuild



[root@linuxeye.com SOURCES]# mkdir -pv ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}



在redhat下,rpm包的默认制作路径在/usr/src/redhat下,但CentOS并没有该目录,因此,我们不得不自定义工作目录,这其中包含了6个目录(要求全部大写)

BUILD:源代码解压以后放的位置RPMS:制作完成后的rpm包存放目录,为特定平台指定子目录(x86_64)SOURCES:收集的源文件,源材料,补丁文件等存放位置    SPECS:存放spec文件,作为制作rpm包的领岗文件,以rpm名.specSRPMS:src格式的rpm包位置 ,既然是src格式的包,就没有平台的概念了           BuiltRoot:假根,使用install临时安装到这个目录,把这个目录当作根来用的,所以在这个目录下的目录文件,才是真正的目录文件。当打包完成后,在清理阶段,这个目录将被删除



[root@linuxeye.com SOURCES]# rpmbuild --showrc | grep topdir  #工作车间目录:_topdir /root/rpmbuild-14: _builddir  %{_topdir}/BUILD-14: _buildrootdir      %{_topdir}/BUILDROOT-14: _rpmdir    %{_topdir}/RPMS-14: _sourcedir %{_topdir}/SOURCES-14: _specdir   %{_topdir}/SPECS-14: _srcrpmdir %{_topdir}/SRPMS-14: _topdir    /root/rpmbuild

rpmbuild –showrc显示所有的宏,以下划线开头,一个下划线:定义环境的使用情况,二个下划线:通常定义的是命令,为什么要定义宏,因为不同的系统,命令的存放位置可能不同,所以通过宏的定义找到命令的真正存放位置

收集源码文件脚本文件

[root@linuxeye.com SOURCES]# pwd/root/rpmbuild/SOURCES[root@linuxeye.com SOURCES]# lsphp-5.4.45.tar.gz

编写SPEC文件

[root@linuxeye.com SPEC]# pwd/root/rpmbuild/SOURCES[root@linuxeye.com SPEC]# vim php.spec #内容如下:




%define _user www%define _group www%define _prefix /usr/local/phpName: php  #软件包名称Version: 5.4.45  #版本号(不能使用-)Release: 1%{?dist}   #release号,对应下面的changelog,如php-5.4.45-1.el6.x86_64.rpmSummary: PHP is a server-side scripting language for creating dynamic Web pages  #简要描述信息,最好不要超过50个字符,如要详述,使用下面的%descriptionGroup: Development/Languages   #要全用这里面的一个组:less /usr/share/doc/rpm-version/GROUPSLicense: GPLv2  #软件授权方式URL: http://www.php.net  #源码相关网站Packager: yeho <lj2007331@gmail.com>  #打包人的信息Vendor: OneinStack  #发行商或打包组织的信息Source0: %{name}-%{version}.tar.gz  #源代码包,可以带多个用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用BuildRoot: %_topdir/BUILDROOT  #安装或编译时使用的“虚拟目录”Requires: libmcryptRequires: mhashRequires: mcrypt  Requires: libiconv #定义php依赖的包,需要yum安装(此处使用epel源)%description  #软件包详述PHP is a widely-used general-purpose scripting language that is especially suited for Web development and can be embedded into HTML.%prep  #软件编译之前的处理,如解压%setup -q  #这个宏的作用静默模式解压并cd%build  #开始编译软件%configure --prefix=%{_prefix} --with-config-file-path=%{_prefix}/etc \--with-fpm-user=%{_user} --with-fpm-group=%{_group} --enable-fpm --enable-fileinfo \--with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd \--with-iconv-dir=/usr/local --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib \--with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-exif \--enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-inline-optimization \--enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl \--with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-ftp --enable-calendar \--with-gettext --enable-zip --enable-soap --disable-ipv6 --disable-debugmake ZEND_EXTRA_LIBS='-liconv' %{?_smp_mflags}  #%{?_smp_mflags} 的意思是:如果就多处理器的话make时并行编译%install  #开始安装软件,如make installrm -rf %{buildroot}make INSTALL_ROOT=%{buildroot} installrm -rf %{buildroot}/{.channels,.depdb,.depdblock,.filemap,.lock,.registry}%{__install} -p -D -m 0755 sapi/fpm/init.d.php-fpm %{buildroot}/etc/init.d/php-fpm%{__install} -p -D -m 0644 php.ini-production %{buildroot}/%{_prefix}/etc/php.ini#rpm安装前执行的脚本%preecho '/usr/local/lib' > /etc/ld.so.conf.d/local.conf/sbin/ldconfigif [ $1 == 1 -a -z "`grep ^%{_user} /etc/passwd`" ]; then    # $1有3个值,代表动作,安装类型,处理类型    groupadd %{_group} -g 10000                              # 1:表示安装    useradd -u 10000 -g 10000 -m %{_user}                    # 2:表示升级fi                                                           # 0:表示卸载#rpm安装后执行的脚本%postif [ $1 == 1 ];then    [ -z "`grep ^'export PATH=' /etc/profile`" ] && echo "export PATH=%{_prefix}/bin:\$PATH" >> /etc/profile    [ -n "`grep ^'export PATH=' /etc/profile`" -a -z "`grep '%{_prefix}' /etc/profile`" ] && sed -i "s@^export PATH=\(.*\)@export PATH=%{_prefix}/bin:\1@" /etc/profile    /sbin/chkconfig --add php-fpm    /sbin/chkconfig php-fpm on    Mem=`free -m | awk '/Mem:/{print $2}'`  #下面主要是参数的优化    if [ $Mem -le 640 ];then        Mem_level=512M        Memory_limit=64    elif [ $Mem -gt 640 -a $Mem -le 1280 ];then        Mem_level=1G        Memory_limit=128    elif [ $Mem -gt 1280 -a $Mem -le 2500 ];then        Mem_level=2G        Memory_limit=192    elif [ $Mem -gt 2500 -a $Mem -le 3500 ];then        Mem_level=3G        Memory_limit=256    elif [ $Mem -gt 3500 -a $Mem -le 4500 ];then        Mem_level=4G        Memory_limit=320    elif [ $Mem -gt 4500 -a $Mem -le 8000 ];then        Mem_level=6G        Memory_limit=384    elif [ $Mem -gt 8000 ];then        Mem_level=8G        Memory_limit=448    fi    sed -i "s@^memory_limit.*@memory_limit = ${Memory_limit}M@" %{_prefix}/etc/php.ini    sed -i 's@^output_buffering =@output_buffering = On\noutput_buffering =@' %{_prefix}/etc/php.ini    sed -i 's@^;cgi.fix_pathinfo.*@cgi.fix_pathinfo=0@' %{_prefix}/etc/php.ini    sed -i 's@^short_open_tag = Off@short_open_tag = On@' %{_prefix}/etc/php.ini    sed -i 's@^expose_php = On@expose_php = Off@' %{_prefix}/etc/php.ini    sed -i 's@^request_order.*@request_order = "CGP"@' %{_prefix}/etc/php.ini    sed -i 's@^;date.timezone.*@date.timezone = Asia/Shanghai@' %{_prefix}/etc/php.ini    sed -i 's@^post_max_size.*@post_max_size = 50M@' %{_prefix}/etc/php.ini    sed -i 's@^upload_max_filesize.*@upload_max_filesize = 50M@' %{_prefix}/etc/php.ini    sed -i 's@^;upload_tmp_dir.*@upload_tmp_dir = /tmp@' %{_prefix}/etc/php.ini    sed -i 's@^max_execution_time.*@max_execution_time = 5@' %{_prefix}/etc/php.ini    sed -i 's@^disable_functions.*@disable_functions = passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,popen@' %{_prefix}/etc/php.ini    sed -i 's@^session.cookie_httponly.*@session.cookie_httponly = 1@' %{_prefix}/etc/php.ini    sed -i 's@^mysqlnd.collect_memory_statistics.*@mysqlnd.collect_memory_statistics = On@' %{_prefix}/etc/php.ini    cat > %{_prefix}/etc/php-fpm.conf <<EOF;;;;;;;;;;;;;;;;;;;;;; FPM Configuration ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Global Options ;;;;;;;;;;;;;;;;;;;[global]pid = run/php-fpm.piderror_log = log/php-fpm.loglog_level = warningemergency_restart_threshold = 30emergency_restart_interval = 60sprocess_control_timeout = 10sdaemonize = yes;;;;;;;;;;;;;;;;;;;;; Pool Definitions ;;;;;;;;;;;;;;;;;;;;;[%{_user}];listen = /dev/shm/php-cgi.socklisten = 127.0.0.1:9000listen.backlog = -1listen.allowed_clients = 127.0.0.1listen.owner = %{_user}listen.group = %{_group}listen.mode = 0666user = %{_user}group = %{_group}pm = dynamicpm.max_children = 12pm.start_servers = 8pm.min_spare_servers = 6pm.max_spare_servers = 12pm.max_requests = 2048pm.process_idle_timeout = 10srequest_terminate_timeout = 120request_slowlog_timeout = 0slowlog = log/slow.logrlimit_files = 51200rlimit_core = 0catch_workers_output = yes;env[HOSTNAME] = $HOSTNAMEenv[PATH] = /usr/local/bin:/usr/bin:/binenv[TMP] = /tmpenv[TMPDIR] = /tmpenv[TEMP] = /tmpEOF    if [ $Mem -le 3000 ];then        sed -i "s@^pm.max_children.*@pm.max_children = $(($Mem/2/20))@" %{_prefix}/etc/php-fpm.conf        sed -i "s@^pm.start_servers.*@pm.start_servers = $(($Mem/2/30))@" %{_prefix}/etc/php-fpm.conf        sed -i "s@^pm.min_spare_servers.*@pm.min_spare_servers = $(($Mem/2/40))@" %{_prefix}/etc/php-fpm.conf        sed -i "s@^pm.max_spare_servers.*@pm.max_spare_servers = $(($Mem/2/20))@" %{_prefix}/etc/php-fpm.conf    elif [ $Mem -gt 3000 -a $Mem -le 4500 ];then        sed -i "s@^pm.max_children.*@pm.max_children = 80@" %{_prefix}/etc/php-fpm.conf        sed -i "s@^pm.start_servers.*@pm.start_servers = 50@" %{_prefix}/etc/php-fpm.conf        sed -i "s@^pm.min_spare_servers.*@pm.min_spare_servers = 40@" %{_prefix}/etc/php-fpm.conf        sed -i "s@^pm.max_spare_servers.*@pm.max_spare_servers = 80@" %{_prefix}/etc/php-fpm.conf    elif [ $Mem -gt 4500 -a $Mem -le 6500 ];then        sed -i "s@^pm.max_children.*@pm.max_children = 90@" %{_prefix}/etc/php-fpm.conf        sed -i "s@^pm.start_servers.*@pm.start_servers = 60@" %{_prefix}/etc/php-fpm.conf        sed -i "s@^pm.min_spare_servers.*@pm.min_spare_servers = 50@" %{_prefix}/etc/php-fpm.conf        sed -i "s@^pm.max_spare_servers.*@pm.max_spare_servers = 90@" %{_prefix}/etc/php-fpm.conf    elif [ $Mem -gt 6500 -a $Mem -le 8500 ];then        sed -i "s@^pm.max_children.*@pm.max_children = 100@" %{_prefix}/etc/php-fpm.conf        sed -i "s@^pm.start_servers.*@pm.start_servers = 70@" %{_prefix}/etc/php-fpm.conf        sed -i "s@^pm.min_spare_servers.*@pm.min_spare_servers = 60@" %{_prefix}/etc/php-fpm.conf        sed -i "s@^pm.max_spare_servers.*@pm.max_spare_servers = 100@" %{_prefix}/etc/php-fpm.conf    elif [ $Mem -gt 8500 ];then        sed -i "s@^pm.max_children.*@pm.max_children = 120@" %{_prefix}/etc/php-fpm.conf        sed -i "s@^pm.start_servers.*@pm.start_servers = 80@" %{_prefix}/etc/php-fpm.conf        sed -i "s@^pm.min_spare_servers.*@pm.min_spare_servers = 70@" %{_prefix}/etc/php-fpm.conf        sed -i "s@^pm.max_spare_servers.*@pm.max_spare_servers = 120@" %{_prefix}/etc/php-fpm.conf    fifi#rpm卸载前执行的脚本%preunif [ $1 == 0 ];then    /etc/init.d/php-fpm stop > /dev/null 2>&1    /sbin/chkconfig --del php-fpm    if [ -e '/etc/profile.d/custom_profile_new.sh' ];then        sed -i 's@%{_prefix}/bin:@@' /etc/profile.d/custom_profile_new.sh    else        sed -i 's@%{_prefix}/bin:@@' /etc/profile    fifi#%postun rpm卸载后执行的脚本%clean    #clean的主要作用就是删除BUILDrm -rf %{buildroot}%files  #指定哪些文件需要被打包,如/usr/local/php%defattr(-,root,root,-)%{_prefix}%attr(0755,root,root) /etc/init.d/php-fpm%changelog  #日志改变段, 这一段主要描述软件的开发记录* Sat Oct 24 2015 yeho <lj2007331@gmail.com> 5.4.45-1- Initial version

下面是php-redis.spec

[root@linuxeye.com SOURCES]# pwd/root/rpmbuild/SOURCES[root@linuxeye.com SOURCES]# lsredis-2.2.7.tgz[root@linuxeye.com SOURCES]# cd ../SPEC[root@linuxeye.com SPEC]# vim php-redis.spec
%global php_extdir %(/usr/local/php/bin/php-config --extension-dir 2>/dev/null || echo "undefined")Name: php-redisVersion: 2.2.7Release: 1%{?dist}Summary: The phpredis extension provides an API for communicating with the Redis key-value store.Group: Development/LanguagesLicense: PHPURL: http://pecl.php.net/package/redisSource0: redis-%{version}.tgzBuildRoot: %_topdir/BUILDROOTRequires: phpBuildRequires: php >= 5.4.40%descriptionThe phpredis extension provides an API for communicating with the Redis key-value store.%prep%setup -q -n redis-%{version}%build/usr/local/php/bin/phpize%configuremake %{?_smp_mflags}%installrm -rf %{buildroot}mkdir -p %{buildroot}%{php_extdir}make install INSTALL_ROOT=%{buildroot}find %{buildroot} -name redis.so -exec /bin/mv {} %{buildroot}%{php_extdir} \;#rpm安装后执行的脚本%postif [ $1 == 1 ];then    [ -z "`grep '^extension_dir' /usr/local/php/etc/php.ini`" ] && echo "extension_dir = \"%{php_extdir}\"" >> /usr/local/php/etc/php.ini    sed -i 's@^extension_dir\(.*\)@extension_dir\1\nextension = "redis.so"@' /usr/local/php/etc/php.inifi#rpm卸载前执行的脚本%preunif [ $1 == 0 ];then    /etc/init.d/php-fpm stop > /dev/null 2>&1    sed -i '/redis.so/d' /usr/local/php/etc/php.inifi#%postun rpm卸载后执行的脚本if [ $1 == 0 ];then    /etc/init.d/php-fpm start > /dev/null 2>&1fi%cleanrm -rf %{buildroot}%files%defattr(-,root,root,-)%{php_extdir}/redis.so%changelog* Sat Oct 24 2015 yeho <lj2007331@gmail.com> 2.2.7-1- Initial version

编译rpm包

[root@linuxeye.com SPEC]# rpmbuild -bb php.spec 制作php rpm二进制包[root@linuxeye.com SPEC]# rpmbuild -bb php-redis.spec 制作php-redis rpm二进制包
原文:https://blog.linuxeye.com/431.html

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
高流量網站的PHP性能調整高流量網站的PHP性能調整May 14, 2025 am 12:13 AM

TheSecretTokeEpingAphp-PowerEdwebSiterUnningSmoothlyShyunderHeavyLoadInVolvOLVOLVOLDEVERSALKEYSTRATICES:1)emplactopCodeCachingWithOpcachingWithOpCacheToreCescriptexecution Time,2)使用atabasequercachingCachingCachingWithRedataBasEndataBaseLeSendataBaseLoad,3)

PHP中的依賴注入:初學者的代碼示例PHP中的依賴注入:初學者的代碼示例May 14, 2025 am 12:08 AM

你應該關心DependencyInjection(DI),因為它能讓你的代碼更清晰、更易維護。 1)DI通過解耦類,使其更模塊化,2)提高了測試的便捷性和代碼的靈活性,3)使用DI容器可以管理複雜的依賴關係,但要注意性能影響和循環依賴問題,4)最佳實踐是依賴於抽象接口,實現鬆散耦合。

PHP性能:是否可以優化應用程序?PHP性能:是否可以優化應用程序?May 14, 2025 am 12:04 AM

是的,優化papplicationispossibleandessential.1)empartcachingingcachingusedapcutorediucedsatabaseload.2)優化的atabaseswithexing,高效Quereteries,and ConconnectionPooling.3)EnhanceCodeWithBuilt-unctions,避免使用,避免使用ingglobalalairaiables,並避免使用

PHP性能優化:最終指南PHP性能優化:最終指南May 14, 2025 am 12:02 AM

theKeyStrategiestosigantificallyBoostPhpaPplicationPerformenCeare:1)UseOpCodeCachingLikeLikeLikeLikeLikeCacheToreDuceExecutiontime,2)優化AtabaseInteractionswithPreparedStateTementStatementStatementAndProperIndexing,3)配置

PHP依賴注入容器:快速啟動PHP依賴注入容器:快速啟動May 13, 2025 am 12:11 AM

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增強codemodocultion,可驗證性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

PHP中的依賴注入與服務定位器PHP中的依賴注入與服務定位器May 13, 2025 am 12:10 AM

選擇DependencyInjection(DI)用於大型應用,ServiceLocator適合小型項目或原型。 1)DI通過構造函數注入依賴,提高代碼的測試性和模塊化。 2)ServiceLocator通過中心註冊獲取服務,方便但可能導致代碼耦合度增加。

PHP性能優化策略。PHP性能優化策略。May 13, 2025 am 12:06 AM

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)啟用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替換loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

PHP電子郵件驗證:確保正確發送電子郵件PHP電子郵件驗證:確保正確發送電子郵件May 13, 2025 am 12:06 AM

phpemailvalidation invoLvesthreesteps:1)格式化進行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具