[How-to] Directadmin Custombuild 2.0 Multi PHP versions selectable by .htaccess

#Directadmin
#custombuild2.0
#Apache 2.4
#php-cgi
#suphp
#Tested on CentOS 6 x86_64

วิธีติดตั้ง PHP หลายเวอร์ชั่น โดยแต่ละเว็บสามารถเลือกเวอร์ชั่นที่ต้องการผ่านไฟล์ .htaccess ได้เองเลย
รองรับ php 5.2 - 5.6 โดยจะใช้เวอร์ชั่นใหนบ้างก็ compile ให้ครบ

ทำการติดตั้ง Directadmin ให้เรียบร้อย ถ้าลงใหม่ก็เลือก custombuild 2.0 กับ php1=5.3/suphp php2=no
หมายเหตุ: หากต้องการ update mysql ควรทำให้เรียบร้อยก่อน เพราะการเปลี่ยน version mysql จะต้อง compile php ใหม่ด้วย แนะนำให้ใช้ mysql 5.5 หรือ 5.6

ขั้นตอนที่ 1 โหลด custombuild 2.0 (ถ้าติดตั้งด้วย custombuild 2 อยู่แล้วก็ข้ามไป)


cd /usr/local/directadmin
rm custombuild.tar.gz
mv custombuild custombuild.old
wget http://files10.directadmin.com/services/custombuild/2.0/custombuild.tar.gz
tar xzf custombuild.tar.gz

ขั้นตอนที่ 2 ตั้งค่า options.conf ของ custombuild ตามนี้


php1_release=5.3
php1_mode=suphp
php2_release=no

php_ini=yes
php_timezone=Asia/Bangkok
php_ini_type=production

x_mail_header=yes

mod_ruid2=no

ขั้นตอนที่ 3 อัพเดต apache 2.4 (สำหรับเครื่องที่ติดตั้งไว้เก่าเป็น apache 2.2 ถ้าติดตั้งด้วย custombuild 2 เป็น apache 2.4 อยู่แล้วก็ข้ามไป)


cd /usr/local/directadmin/custombuild
./build apache

ขั้นตอนที่ 4 suphp


cd /usr/local/directadmin/custombuild
./build suphp

ขั้นตอนที่ 5 compile php 5.3 5.4 5.5 5.6


cd /usr/local/directadmin/custombuild
./build set php1_release 5.3
./build set php1_mode suphp
./build set php2_release no
./build php d (ถ้าเพิ่งติดตั้งใหม่สั่ง php n ถ้าติดตั้งนานแล้วสั่ง php d เพื่อให้ update lib ต่างๆด้วยเลย)

./build set php1_release 5.4
./build php n

./build set php1_release 5.5
./build php n

./build set php1_release 5.6
./build php n

ขั้นตอนที่ 6 compile php 5.2 (ถ้าไม่ต้องการใช้ php 5.2 ก็ข้ามไปข้อ 7 เลย)


cd /usr/local/directadmin/custombuild
wget http://files10.directadmin.com/services/custombuild/php-5.2.17.tar.gz
wget http://files10.directadmin.com/services/custombuild/php-5.2.x-mail-header.patch
tar xzf php-5.2.17.tar.gz
patch -p0 < php-5.2.x-mail-header.patch
cd php-5.2.17

สร้างไฟล์ configure.php5 ใหม่ตามนี้


#!/bin/sh
"./configure" \
"--prefix=/usr/local/php52" \
"--enable-force-cgi-redirect" \
"--enable-fastcgi" \
"--program-suffix=52" \
"--with-config-file-scan-dir=/usr/local/php52/lib/php.conf.d" \
"--with-curl=/usr/local/lib" \
"--with-gd" \
"--with-gettext" \
"--with-jpeg-dir=/usr/local/lib" \
"--with-freetype-dir=/usr/local/lib" \
"--with-kerberos" \
"--with-mcrypt" \
"--with-mhash" \
"--with-mysql=/usr" \
"--with-mysqli=/usr/bin/mysql_config" \
"--with-pcre-regex=/usr/local" \
"--with-pdo-mysql=/usr" \
"--with-pear=/usr/local/lib/php" \
"--with-png-dir=/usr/local/lib" \
"--with-xsl" \
"--with-zlib" \
"--with-zlib-dir=/usr/local/lib" \
"--with-openssl" \
"--with-iconv=/usr/local" \
"--enable-bcmath" \
"--enable-calendar" \
"--enable-exif" \
"--enable-ftp" \
"--enable-gd-native-ttf" \
"--enable-magic-quotes" \
"--enable-soap" \
"--enable-sockets" \
"--enable-mbstring" \
"--enable-zip" \
"--enable-wddx"


sh configure.php5
make && make install
cp php.ini-recommended /usr/local/php52/lib/php.ini

ขั้นตอนที่ 7 กำหนด version php ของระบบ (php ที่เรียกใช้ผ่าน command shell / cron และ directadmin เรียกใช้งาน เปลี่ยน ? เป็นเวอร์ชั่นที่ต้องการ แนะนำเป็น 5.3,5.4)


cd /usr/local/bin
rm php
ln -s /usr/local/php5?/bin/php5? php

ขั้นตอนที่ 8 กำหนด php เวอร์ชั่นต่างๆ ให้ suphp

แก้ไขไฟล์ /usr/local/suphp/etc/suphp.conf ใน section handlers (compile เวอร์ชั่นใหนบ้างก็ใส่ให้ครบตามนั้น)


[handlers]
;Handler for php-scripts
x-httpd-php52="php:/usr/local/php52/bin/php-cgi52"
x-httpd-php53="php:/usr/local/php53/bin/php-cgi53"
x-httpd-php54="php:/usr/local/php54/bin/php-cgi54"
x-httpd-php55="php:/usr/local/php55/bin/php-cgi55"
x-httpd-php56="php:/usr/local/php56/bin/php-cgi56"

แก้ไขไฟล์ /etc/httpd/conf/extra/httpd-suphp.conf


<IfModule mod_suphp.c>
<FilesMatch "\.(inc|php|php3|php4|php44|php5|php52|php53|php54|php55|php56|php6|phtml|phps)$">
AddHandler x-httpd-php5? .inc .php .php3 .php4 .php5 .php56 .phtml  ## จะเป็นเวอร์ชั่น default php ของเว็บทั้งระบบ เปลี่ยน ? เป็นเวอร์ชั่นที่ต้องการ
</FilesMatch>
<Location />
suPHP_Engine on
###suPHP_ConfigPath /usr/local/php53/lib/
suPHP_AddHandler x-httpd-php52
suPHP_AddHandler x-httpd-php53
suPHP_AddHandler x-httpd-php54
suPHP_AddHandler x-httpd-php55
suPHP_AddHandler x-httpd-php56
</Location>
</IfModule>

เสร็จแล้ว restart httpd


service httpd restart

ขั้นตอนที่ 9 reset file owner ของแต่ละ user (ทั้งระบบจะใช้ php เป็นโหมด cgi ไม่จำเป็นต้อง chmod 777 เหมือนกับ php_cli (DSO) หากเดิมใช้ระบบ php cli อยู่ จะต้อง reset owner ไฟล์ที่เป็น apache มาเป็น user )


cd /usr/local/directadmin/scripts && ./set_permissions.sh user_homes
find /home/*/domains/*/public_html -type d -print0 | xargs -0 chmod 711
find /home/*/domains/*/public_html -type f -print0 | xargs -0 chmod 644
cd /usr/local/directadmin/data/users && for i in `ls`; do { chown -R $i:$i /home/$i/domains/*/public_html;}; done;

กรณีเปิดให้ใช้งาน cgi ก็สั่ง 3 บรรทัดนี้เพิ่ม (ปกติปิดใช้งาน)


find /home/*/domains/*/public_html  -type f -name '*.cgi*' -exec chmod 755 {} \;
find /home/*/domains/*/public_html  -type f -name '*.pl*' -exec chmod 755 {} \;
find /home/*/domains/*/public_html  -type f -name '*.pm*' -exec chmod 755 {} \;

ขั้นตอนที่ 10 สำหรับเว็บที่ต้องการใช้ php version ต่างจาก default ของระบบ ก็กำหนดเวอร์ชั่นของ php ผ่านไฟล์ .htaccess ของเว็บนั้น

สร้าง/แก้ไข ไฟล์ .htaccess ใน folder public_html (ให้มี owner เป็น user นั้นๆ) แล้วเพิ่ม code ต่อไปนี้ลงไป


<FilesMatch "\.(inc|php|php3|php4|php44|php5|php52|php53|php54|php55|php56|php6|phtml|phps)$">
AddHandler x-httpd-php5? .inc .php .php3 .php4 .php5 .php53 .phtml ## เวอร์ชั่น php ที่จะใช้ เปลี่ยน ? เป็นเวอร์ชั่นที่ต้องการ
suPHP_ConfigPath /home/user/ ## กรณีต้องการใช้ php.ini ส่วนตัว ให้สร้างไฟล์ php.ini ไว้ใน path ที่กำหนด โดยอยู่ใน /home/user นั้นๆ เช่น /home/user/php/ กรณีใช้ php.ini ของระบบ ก็ลบบรรทัดนี้ออกหรือใส่ # ไว้
</FilesMatch>

หมายเหตุ: กำหนดนามสกุลไฟล์เท่าที่ใช้จริงก็พอ เช่น .inc .php แค่นี้ก็พอ เพราะปกติ .php5 .php53 ไม่ได้ใช้อยู่แล้ว


<FilesMatch "\.(inc|php|phtml|phps)$">
AddHandler x-httpd-php5x .inc .php .phtml
suPHP_ConfigPath /home/user/
</FilesMatch>

หมายเหตุ:

  1. หาก update php ใหม่ด้วย custombuild 2 (ยกเว้น php5.2 ที่ compile เอง) จะต้องทำ ขั้นตอนที่ 7 และ 8 ใหม่ทุกครั้ง เพราะ custombuild จะแก้เหลือเวอร์ชั่นที่เพิ่ง compile แค่เวอร์ชั่นเดียว
  2. ถ้ากำหนด default php ของเว็บทั้งระบบเป็น php 5.2 แนะนำให้สร้างไฟล์ .htaccess ใน /var/www/html กำหนด php เป็น 5.3 หรือ 5.4 จะได้ใช้ roundcube version ล่าสุด และ phpmyadmin version 4 ได้

:th_059_:
HAPPY NEW YEARS 2015

ขอบคุณครับ :smiley:

สุดยอดครับ
ขอบคุณมากครับ

ของขวัญปีใหม่ดีสุด ๆ ขอบคุณครับ

อยากได้ peak เพราะแค่นี้แหละ ฮ่าๆๆ

:875328cc: ขอบคุณมากๆ ครับ นั่งงมอยู่นานมาก ไม่สมบูรณ์ซะที คราวนี้ละ :slight_smile:

คำเตือนอย่างนึงนะครับ

รันใน mode suPHP จะช้า และเปลืองทรัพยากรกว่า mode apache sapi/fastcgi มากๆ และทำให้พวก apc/xcache ไม่มีผลด้วยนะครับ

ถ้าตัด php 5.2 ทิ้งได้ ก็ใช้ custombuild 2.0 ลง php แบบ fpm ได้เลย เลือกใช้ได้ 2 version

เอาจริงๆมันใช้หลาย version ได้ แต่ da มันเขียน config ให้แค่ 1-2 version ตาม options ของ custombuild ถ้าจะเอาจริงๆก็ต้องไปเขียน script post_user_add ให้สร้าง config เพิ่มให้ครบ

วิธีข้างบนก็ไว้เป็นทางเลือกสำหรับเครื่องที่ปกติไม่ได้ทำงานหนักมาก

ขอบคุณครับ

[B]php ถ้าเรา compile แต่ละ เวอร์ชั่นแยกกัน (mod_php)
แบบไม่ใช้ suphp [/B]เราจะสร้าง พวกนี้ได้เองได้อย่างไรครับ

AddHandler application/x-httpd-php53 -> /usr/local/php53/bin/php
AddHandler application/x-httpd-php52 -> /usr/local/php52/bin/php
AddHandler application/x-httpd-php51 -> /usr/local/php51/bin/php
AddHandler application/x-httpd-php5 -> /usr/local/php5/bin/php
AddHandler application/x-httpd-php4 -> /usr/local/php4/bin/php

ผมลอง แบบนี้ก็ยังไม่ได้ครับ
Action application/x-httpd-php53 /usr/local/php53/bin/php

เราไม่ใช้ suphp พอจะได้ไหมครับ
ขอบคุณครับ

เวลาต้องการ build php แต่ละ version โดยไม่ต้อง set option ใหม่ สามารถใช้คำสั่งนี้ได้ครับ

cd /usr/local/directadmin/custombuild
./build php_expert php_release php_mode

เช่น
./build php_expert 5.4 suphp
./build php_expert 5.5 suphp
./build php_expert 5.6 suphp

สำหรับท่านใด ที่ลง PHP 5.2 หรือ 5.4 แล้ว compile ไม่ผ่าน

2.17/TSRM -I/usr/local/directadmin/custombuild/php-5.2.17/Zend -I/usr/local/include -g -O2 -c /usr/local/directadmin/custombuild/php-5.2.17/ext/dom/node.c -o ext/dom/node.lo
/usr/local/directadmin/custombuild/php-5.2.17/ext/dom/node.c: In function ‘dom_canonicalization’:
/usr/local/directadmin/custombuild/php-5.2.17/ext/dom/node.c:1953: error: dereferencing pointer to incomplete type
/usr/local/directadmin/custombuild/php-5.2.17/ext/dom/node.c:1955: error: dereferencing pointer to incomplete type
make: *** [ext/dom/node.lo] Error 1

========================================================
cd /usr/local/directadmin/custombuild
wget http://files10.directadmin.com/services/custombuild/php-5.2.17.tar.gz
wget http://files10.directadmin.com/services/custombuild/php-5.2.x-mail-header.patch
tar xzf php-5.2.17.tar.gz
patch -p0 < php-5.2.x-mail-header.patch
cd php-5.2.17

curl -o php-5.2.17.patch https://mail.gnome.org/archives/xml/2012-August/txtbgxGXAvz4N.txt
patch -p0 < php-5.2.17.patch

========================================================

เวอร์ชั่นอื่นๆ เช่น
curl -o php-5.4.5.patch https://mail.gnome.org/archives/xml/2012-August/txtbgxGXAvz4N.txt
$ tar jxf php-5.4.5.tar.bz2
$ cd php-5.4.5
$ patch -p0 -b <…/php-5.4.5.patch
patching file ext/dom/node.c
patching file ext/dom/documenttype.c
patching file ext/simplexml/simplexml.c

อันนี้กลัวไฟล์ patch หายครับ
Credit Thank : Alfa-Host

— ext/dom/node.c 2012-08-06 17:49:48.826716692 +0800
+++ ext/dom/node.c 2012-08-06 17:52:47.633484660 +0800
@@ -1895,9 +1895,17 @@ static void dom_canonicalization(INTERNA
RETVAL_FALSE;
} else {
if (mode == 0) {
+#ifdef LIBXML2_NEW_BUFFER

  •        ret = xmlOutputBufferGetSize(buf);
    

+#else
ret = buf->buffer->use;
+#endif
if (ret > 0) {
+#ifdef LIBXML2_NEW_BUFFER

  •            RETVAL_STRINGL((char *) xmlOutputBufferGetContent(buf), ret, 1);
    

+#else
RETVAL_STRINGL((char *) buf->buffer->content, ret, 1);
+#endif
} else {
RETVAL_EMPTY_STRING();
}
— ext/dom/documenttype.c 2012-08-06 18:02:16.019640870 +0800
+++ ext/dom/documenttype.c 2012-08-06 18:06:16.612228905 +0800
@@ -205,7 +205,13 @@ int dom_documenttype_internal_subset_rea
if (buff != NULL) {
xmlNodeDumpOutput (buff, NULL, (xmlNodePtr) intsubset, 0, 0, NULL);
xmlOutputBufferFlush(buff);
+
+#ifdef LIBXML2_NEW_BUFFER

  •        ZVAL_STRINGL(*retval, xmlOutputBufferGetContent(buff),
    
  •                     xmlOutputBufferGetSize(buff), 1);
    

+#else
ZVAL_STRINGL(*retval, buff->buffer->content, buff->buffer->use, 1);
+#endif
(void)xmlOutputBufferClose(buff);
return SUCCESS;
}
— ext/simplexml/simplexml.c 2012-08-06 18:10:44.621017026 +0800
+++ ext/simplexml/simplexml.c 2012-08-06 18:12:48.016270419 +0800
@@ -1417,7 +1417,12 @@ SXE_METHOD(asXML)

         xmlNodeDumpOutput(outbuf, (xmlDocPtr) sxe-&gt;document-&gt;ptr, node, 0, 0, ((xmlDocPtr) sxe-&gt;document-&gt;ptr)-&gt;encoding);
         xmlOutputBufferFlush(outbuf);

+#ifdef LIBXML2_NEW_BUFFER

  •        RETVAL_STRINGL((char *)xmlOutputBufferGetContent(outbuf),
    
  •                       xmlOutputBufferGetSize(outbuf), 1);
    

+#else
RETVAL_STRINGL((char *)outbuf->buffer->content, outbuf->buffer->use, 1);
+#endif
xmlOutputBufferClose(outbuf);
}
} else {

credit: [solved] Compile PHP 5.2 | LiteSpeed Support Forums

สำหรับไฟล์ php-5.2.x-mail-header.patch ท่านใด patch ไม่ได้
fix ดังนี้ครับ

cd /usr/local/directadmin/custombuild
cd php-5.2.17

wget http://files10.directadmin.com/services/custombuild/php-5.2.x-mail-header.patch

[QUOTE]— a/ext/standard/mail.c 2010-12-11 23:35:23.000000000 +0800
+++ b/ext/standard/mail.c 2010-12-11 23:35:41.000000000 +0800
@@ -216,6 +216,49 @@
void (*sig_handler)() = NULL;
#endif

แก้เป็น

— ext/standard/mail.c 2010-12-11 23:35:23.000000000 +0800
+++ ext/standard/mail.c 2010-12-11 23:35:41.000000000 +0800
@@ -216,6 +216,49 @@
void (*sig_handler)() = NULL;
#endif

patch -p0 < php-5.2.x-mail-header.patch

[/QUOTE]

ทำไมผมทำไม่สำเร็จ หว่า T-T หรือช่วง 2 เดือนนี้มีเปลี่ยนแปลงอะไรใน custom build ป่ะ

Wrong php_ini_type set in options.conf.

ตอนนี้ค่าเป้นอะไรครับ

custombuild 2.0 ปกติมาเป็น no ครับ แต่พี่จะใส่เป็น yes ก็ได้

./build set php_ini yes

เมื่อวานลองทำตาม smtalk กระทู้นานแล้วไม่รู้ยังใช้ได้อยู่หรือเปล่า ผมสั่ง ./build all d ต่อจากเขาไปอีกแต่ติด error ตอนบิว suphp ลืมเซฟไว้ด้วยเลยกลับไปใช้ php5.3 เหมือนเดิมก่อน
ถ้าทำได้ผมว่าก็สะดวกดีนะครับ เลือกเวอร์ชั่น php ที่ลูกค้าต้องการใน DirectAdmin ได้เลยไม่ต้องใช้ .htaccess แต่ไม่รู้ว่าจำกัด php แค่ 2 เวอร์ชั่นหรือเปล่า
http://forum.directadmin.com/showthread.php?t=48028

Feel free to use any php[B]X[/B]_mode, the example is given with suphp:
Code:
cd /usr/local/directadmin/custombuild
./build update
./build set mod_ruid2 no
./build set php1_release 5.5
./build set php2_release 5.3
./build set php1_mode suphp
./build set php2_mode suphp
More about CB 2.0:
http://forum.directadmin.com/showthread.php?t=44743

In #12 it’s mentioned that PHP version could be changed in domain settings (user level). Good luck!
http://www.directadmin.com/features.php?id=1456

php 5.2.17 ก็ ใช้ตัว patch ให้มันรัน php-fpm ได้ อะไรก็น่าจะง่ายขึ้นเยอะครับ

CB 2 จะเลือก php ได้จากใน da โดยมันไปสลับ version ใน httpd.conf ของ user นั้นๆ ทำให้ต้อง restart httpd ทุกครั้งที่ user ไปสลับ version ถ้านานๆสลับทีก็คงไม่เป็นไร แค่ถ้ามี user เยอะๆ แล้วผลัดกันสลับเป็นว่าเล่น httpd ก็จะ restart บ่อย โดยไม่จำเป็น สู้ใช้ .htaccess ไม่ได้
และอีกอย่างถ้าไม่ได้ใช้ php 5.2 ก็ใช้เป็นโหมด php-fpm ไปเลย custombuild 2 รองรับอยู่แล้ว สลับ version ได้จากใน da เหมือนกัน (restart httpd)

ตอน compile php 5.2
cd /usr/local/directadmin/custombuild wget http://files10.directadmin.com/services/custombuild/php-5.2.17.tar.gz
wget http://files10.directadmin.com/services/custombuild/php-5.2.x-mail-header.patch
tar xzf php-5.2.17.tar.gz
patch -p0 < php-5.2.x-mail-header.patch

[root@server custombuild]# patch -p0 < php-5.2.x-mail-header.patch
can’t find file to patch at input line 3
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:

|— a/ext/standard/mail.c 2010-12-11 23:35:23.000000000 +0800

+++ b/ext/standard/mail.c 2010-12-11 23:35:41.000000000 +0800

File to patch:

พอใช้คำสั่ง patch แล้วขึ้นแบบนี้ไปต่อไม่เป็นเลย ช่วยด้วยครับ

แก้เป็น patch -p1 ครับ

patch -p1 < php-5.2.x-mail-header.patch ก็ขึ้นแบบเดิมครับ