Installing memcache on PHP 7.1

แปะเก็บไว้

CentOS 6 (prerequisite)

# install webtatic repo
rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm
# install memcache things
yum -y install yum-plugin-replace
yum -y install libmemcached
yum -y replace libmemcached --replace-with libmemcached10
yum -y install libmemcached10-devel.x86_64

CentOS 7 (prerequisite)

yum -y install libmemcached-devel

 Install memcached.so

yum -y install git
cd ~
git clone https://github.com/php-memcached-dev/php-memcached.git
cd php-memcached
git checkout php7
phpize
./configure --disable-memcached-sasl
make
sudo make install

ปัญหา CURL ไป https:// บางที่แล้ว error

ถ้าเสิร์ช Google หลายๆ ที่จะบอกให้ปิด CURLOPT_SSL_VERIFYPEER ตอนเรียกใช้ curl ซึ่งจริงๆ แล้วเพื่อความปลอดภัย เราไม่ควรจะปิดการเช็คตรงนั้น

สำหรับวิธีแก้ที่ถูกต้องคือ ให้เราไปดาวน์โหลดไฟล์ cacert.pem จากเว็บนี้ http://curl.haxx.se/docs/caextract.html มา

แล้วแก้ที่ไฟล์ php.ini ลักษณะนี้

curl.cainfo=c:\php\cacert.pem

Installing Apache 2.4, PHP 5.5 Windows 7

  1. สร้างโฟลเดอร์ c:/wamp/
  2. ดาวน์โหลดไฟล์ httpd-2.4.7-win32-VC11.zip (ถ้าอยากได้เวอร์ชั่นล่าสุดให้ดูที่เว็บนี้ http://www.apachelounge.com/download/) บทความนี้เลือกใช้ win32 เพราะว่า VC11 x86 Thread Safe ในเว็บ PHP มันยังเป็น experimental อยู่
  3. เอาไฟล์ของ httpd ที่โหลดในข้อก่อนหน้า มา Extract ไว้ที่พาท
    c:/wamp/apache2.4_win32/
  4. ดาวน์โหลดไฟล์ php-5.5.7-Win32-VC11-x86.zip (ถ้าอยากได้เวอร์ชั่นล่าสุดหาดูจากที่นี่ http://windows.php.net/download/ ให้เลือกอันที่เป็น VC11 Thread Safe ส่วนถ้า x64 มันไม่ experimental แล้ว ก็น่าโหลดเอามาใช้นะ แต่ต้องเปลี่ยน httpd ให้เป็น win64 ด้วย)
  5. สร้างโฟลเดอร์ c:/wamp/php-5.5.7_win32/ เอาไฟล์ที่โหลดก่อนนี้มาใส่พาทนี้
  6. แก้ไฟล์ c:/wamp/apache2.4_win32/conf/httpd.conf
    Replace: c:/Apache24/htdocs
    With: c:/wamp/www
  7. เติม code นี้เข้าไปที่ด้านล่างสุด
    LoadModule php5_module "c:/wamp/php-5.5.7/php5apache2_4.dll"
    AddHandler application/x-httpd-php .php
    PHPIniDir "c:/wamp/php-5.5.7"
    DirectoryIndex index.html index.php
  8. Load Module ดังนี้
    1. mod_expires.so
    2. mod_headers.so
    3. mod_rewrite.so
    4. mod_socache_shmcb.so
    5. mod_ssl.so
    6. mod_vhost_alias.so
  9. Uncomment บรรทัดนี้ Include conf/extra/httpd-ssl.conf
  10. แก้ไฟล์ c:/wamp/apache2.4_win32/conf/extra/httpd-ssl.conf
    1. SSLCertificateFile “C:\wamp\apache2.4_win32\conf\server.crt”
    2. SSLCertificateKeyFile “C:\wamp\apache2.4_win32\conf\server.key”
    3. DocumentRoot “c:/wamp/www”
  11. ไปที่โฟลเดอร์ php-5.5.7_win32 แล้ว copy php.ini-development ตั้งชื่อไฟล์เป็น php.ini
  12. แก้ไฟล์ php.ini
    1. extension_dir = “C:/wamp/php-5.5.7_win32/ext”
    2. date.timezone = “Asia/Bangkok”
    3. enable extensions
      1. php_curl.dll
      2. php_gd2.dll
      3. php_imap.dll
      4. php_mbstring.dll
      5. php_mysql.dll
      6. php_mysqli.dll
      7. php_openssl.dll
      8. php_tidy.dll
    4. เติมโค๊ดนี้ที่ท้ายไฟล์
      zend_extension="c:\wamp\php-5.5.7_win32\ext\dbg-php-5.5.dll"
      [debugger]
      debugger.enabled=on
      debugger.profiler_enabled=on
      debugger.hosts_allow= 127.0.0.1 localhost ::1 127.0.0.1
      debugger.hosts_deny=ALL
      debugger.ports=7869
  13. copy ไฟล์ dbg-php-5.5.dll จากในโฟลเดอร์โปรแกรม phpED ไปใส่ตรง c:\wamp\php-5.5.7_win32\ext\ ด้วย
  14. เปิด cmd โดย run as administrator
    1. รันคำสั่ง
    2. cd /wamp/apache2.4_win32/conf/
    3. ..\bin\openssl.exe req -config openssl.cnf -x509 -nodes -subj “/C=TH/ST=Bangkok/L=Bangkok/O=localhost/OU=SEC/CN=localhost” -days 1825 -newkey rsa:2048 -keyout server.key -out server.crt
    4. c:\wamp\apache2.4_win32\bin\httpd.exe -k install
  15. (ข้อนี้ข้ามไปก็ได้ ไว้ถ้ามีปัญหาค่อยกลับมาทำ)
    ใน Environment Variables ตรง System Variables
    ที่ตัวแปร PATH ให้เติม C:\wamp\apache2.4_win32\; C:\wamp\apache2.4_win32\bin ต่อเข้าไป

 

วิธีการ configure vhost

<VirtualHost 127.0.0.1:80>
  DocumentRoot "C:/wamp/site2/"
  ServerName www.site2.local
  ServerAlias site2.local www.site2.local
</VirtualHost>
<VirtualHost 127.0.0.1:443>
  DocumentRoot "C:/wamp/site2/"
  ServerName www.site2.local
  ServerAlias site2.local www.site2.local
  SSLEngine on
  SSLCertificateFile "c:/Wamp/Apache2.4_win32/conf/server.crt"
  SSLCertificateKeyFile "c:/Wamp/Apache2.4_win32/conf/server.key"
</Virtual>

ถ้าในกรณีที่ DocumentRoot ของ VirtualHost อยู่คนละพาทกับ DocumentRoot หลักใน httpd.conf ให้ไปเพิ่ม <Directory … > ….. </Directory> ใน httpd.conf ด้วย

How to check array isset and is_null in PHP

ถ้า value ของ Array ช่องนึงเป็น NULL เวลาที่เช็คด้วยคำสั่ง isset มันจะได้ false ดังตัวอย่างนี้

<?php
    $arr = array();
    $arr['foo'] = NULL;
    var_dump( isset( $arr['foo'] ); // ให้ผลลัพท์เป็น bool(false)
?>

วิธีที่จะเช็คว่า Array มีการกำหนด key นั้นอยู่ และค่าของมันเป็น NULL ด้วย ให้ใช้คำสั่ง array_key_exists ดังตัวอย่างนี้นี้

<?php
    if ( array_key_exists( 'foo', $arr ) && is_null( $arr['foo'] ) )
        echo "OK";
?>

Modifying timthumb.php in wordpress’s theme for optimize performance

ปรกติแล้วใน timthumb.php จะมีความสามารถในการ cache รูปที่ถูกย่ออยู่แล้ว เพื่อไม่ให้มันต้อง crop รูปสำหรับทุกๆ request. แต่ว่าปัญหา คือ ไฟล์ cache ของ timthumb นั้น มันไม่ใช่ไฟล์รูปที่สามารถเปิดดูได้โดยตรง เพราะว่าที่ส่วนหัวของ cache จะมี filePrependSecurityBlock แทรกอยู่เพื่อป้องกันการส่งสคริปท์ php เข้าไปรัน. จากลักษณะการทำงานที่เป็นชี้นี้ ทำให้เราไม่สามารถใช้พวก Reverse proxy หรือ CDN มาช่วยในการลดโหลดได้ของ WordPress ที่มีจำนวน Traffic สูงๆ ได้ (ไม่งั้นมันเรียก php ขึ้นมาทำงานตลอด). Continue reading “Modifying timthumb.php in wordpress’s theme for optimize performance”

เปิด/ปิด register_globals ต่างกันอย่างไร

สมัยก่อน (PHP รุ่นก่อนเวอร์ชั่น 4.2.1) ตัวแปรที่ส่งมาจากภายนอก ( GET, POST ) และตัวแปร SESSION จะใช้ปนกับตัวแปรที่ใช้ภายในโปรแกรมเลย

ต่อมาหลังจากเวอร์ชั่น 4.2.1   php ก็ได้พัฒนาให้การรับค่าตัวแปรรัดกุมขึ้น โดยใช้ตัวแปรแยกออกมาสำหรับ GET, POST และ SESSION แต่ก็เปิดให้ผู้พัฒนาเว็บไซต์สามารถเลือกกลับไปใช้แบบเก่าได้ ด้วยการเปิด register_globals ซึ่งสามารถตั้งในไฟล์ .htaccess   หรือถ้าเป็นเซิร์ฟเวอร์ของคุณเอง คุณสามารถที่จะตั้งใน php.ini ก็ได้ เพื่อให้มีผลกับทั้งเซิร์ฟเวอร์

Continue reading “เปิด/ปิด register_globals ต่างกันอย่างไร”

ปัญหา Query หนักใน plugin post-views ของ WordPress

วันก่อนเซิร์ฟเวอร์เครื่องหนึ่งเกิดปัญหาโหลดขึ้นสูงอย่างหนัก จึงได้เข้าไปตรวจสอบ

พบว่าสาเหตุเกิดจาก เว็บไซต์ลูกค้ารายหนึ่ง ใช้ WordPress และมีคนเข้าจำนวนมาก เค้าได้ติดตั้ง plugin ที่มีชื่อ post-views เข้าใจว่ามันจะทำการนับ stats และแสดงรายการ posts ที่มีคนเข้าชมเยอะ ไรประมาณนั้น

ใน Query ที่ plugin มันเขียน มันใช้ SELECT ใหม่ทุก โดยใช้ WHERE ระบุเป็นเงื่อนไขเวลาที่ละเอียดเป็นวินาทีเลย.  ผมเลยลองเข้าไปแก้ให้ Query มัน WHERE โดยใช้เวลาเป็น floor ที่ interval=20 minutes  เพราะตอนแรกเดาว่ามันน่าจะได้ประโยชน์จาก MySQL query cache  แต่ปรากฎว่าไม่ช่วยแฮะ ไม่รู้ว่า result มันขนาดเกิน cache limit หรือเปล่า

ผมเลยแก้ให้มันเขียน result ลงไฟล์แทน โดยใช้ serialize

ต้องสร้างโฟลเดอร์ /wp-content/plugins/post-views/cache/ และเปิดสิทธิ์ให้ php เขียนไฟล์ในโฟลเดอร์นี้ได้ด้วย

อันนี้เป็นไฟล์ที่ผมแก้แล้ว  แก้ 2 จุดครับ ประมาณบรรทัดที่ 2243 และ 2412 ครับ (ดาวน์โหลด post-views.php)

How to enable using the $_GET variable in CodeIgniter

คงจะทราบดีว่า ถ้าเราตั้ง $config[‘enable_query_strings’] = FALSE ตัว CodeIgniter มันจะ unset ตัวแปร $_GET ของเราซะงั้น  ครั้งแรกที่ผมแก้ ผมเข้าไปแก้ที่ core ของ CodeIgniter เลยครับ  แต่วันนี้ผมคิดเทคนิคดีๆ ได้แล้ว เลยอยากบอกต่อครับ

ให้เข้าไปตั้งค่าในไฟล์ config.php ดังนี้ครับ

Continue reading “How to enable using the $_GET variable in CodeIgniter”