<?php $cleaned = mb_convert_encoding($raw, 'UTF-8', 'UTF-8');
Tag: PHP
Gracefully stop PHP process with PCNTL
เวลาเขียน process ไรสักอย่างด้วย PHP ที่ใส่ loop ไว้เพื่อให้มันทำงานไปตลอดจนกว่าจะโดน kill เราสามารถใช้ PCNTL เพื่อให้ script PHP รู้ว่ามีคนขอ ให้ process หยุดทำงานได้แล้ว ถ้ามีงานที่ทำต่อเนื่องอยู่ยังไม่ถึง checkpoint จะได้มีโอกาสทำต่อให้เสร็จก่อน และก็ exit; ตัวเองซะ ไม่ต้องไปทำ task ต่อไป.
Continue reading “Gracefully stop PHP process with PCNTL”ปัญหา 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" openssl.cafile="c:\php\cacert.pem"
Installing Apache 2.4, PHP 5.5 Windows 7
- สร้างโฟลเดอร์ c:/wamp/
- ดาวน์โหลดไฟล์ httpd-2.4.7-win32-VC11.zip (ถ้าอยากได้เวอร์ชั่นล่าสุดให้ดูที่เว็บนี้ http://www.apachelounge.com/download/) บทความนี้เลือกใช้ win32 เพราะว่า VC11 x86 Thread Safe ในเว็บ PHP มันยังเป็น experimental อยู่
- เอาไฟล์ของ httpd ที่โหลดในข้อก่อนหน้า มา Extract ไว้ที่พาท
c:/wamp/apache2.4_win32/ - ดาวน์โหลดไฟล์ php-5.5.7-Win32-VC11-x86.zip (ถ้าอยากได้เวอร์ชั่นล่าสุดหาดูจากที่นี่ http://windows.php.net/download/ ให้เลือกอันที่เป็น VC11 Thread Safe ส่วนถ้า x64 มันไม่ experimental แล้ว ก็น่าโหลดเอามาใช้นะ แต่ต้องเปลี่ยน httpd ให้เป็น win64 ด้วย)
- สร้างโฟลเดอร์ c:/wamp/php-5.5.7_win32/ เอาไฟล์ที่โหลดก่อนนี้มาใส่พาทนี้
- แก้ไฟล์ c:/wamp/apache2.4_win32/conf/httpd.conf
Replace: c:/Apache24/htdocs With: c:/wamp/www
- เติม 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
- Load Module ดังนี้
- mod_expires.so
- mod_headers.so
- mod_rewrite.so
- mod_socache_shmcb.so
- mod_ssl.so
- mod_vhost_alias.so
- Uncomment บรรทัดนี้ Include conf/extra/httpd-ssl.conf
- แก้ไฟล์ c:/wamp/apache2.4_win32/conf/extra/httpd-ssl.conf
- SSLCertificateFile “C:\wamp\apache2.4_win32\conf\server.crt”
- SSLCertificateKeyFile “C:\wamp\apache2.4_win32\conf\server.key”
- DocumentRoot “c:/wamp/www”
- ไปที่โฟลเดอร์ php-5.5.7_win32 แล้ว copy php.ini-development ตั้งชื่อไฟล์เป็น php.ini
- แก้ไฟล์ php.ini
- extension_dir = “C:/wamp/php-5.5.7_win32/ext”
- date.timezone = “Asia/Bangkok”
- enable extensions
- php_curl.dll
- php_gd2.dll
- php_imap.dll
- php_mbstring.dll
- php_mysql.dll
- php_mysqli.dll
- php_openssl.dll
- php_tidy.dll
- เติมโค๊ดนี้ที่ท้ายไฟล์
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
- copy ไฟล์ dbg-php-5.5.dll จากในโฟลเดอร์โปรแกรม phpED ไปใส่ตรง c:\wamp\php-5.5.7_win32\ext\ ด้วย
- เปิด cmd โดย run as administrator
- รันคำสั่ง
- cd /wamp/apache2.4_win32/conf/
- ..\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
- c:\wamp\apache2.4_win32\bin\httpd.exe -k install
- (ข้อนี้ข้ามไปก็ได้ ไว้ถ้ามีปัญหาค่อยกลับมาทำ)
ใน 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 ด้วย
function fgetcsv with Thai Language
ฟังก์ชั่น fgetcsv ใช้สำหรับอ่านไฟล์ csv โดยมันจะทำการ parse ออกมาเป็น Array ให้เราเลยครับ. แต่ก่อนตอนที่ผมยังไม่รู้จักคำสั่งนี้ นั่งเขียนตัว Parse เองตั้งนานครับ แถมยังมีบั๊กอีกต่างหาก (- -‘)
เข้าเรื่องครับ… ผมยังไม่ได้ศึกษาอย่างจริงจังเหมือนกัน ว่าสาเหตุมันคืออะไรกันแน่ (เพราะขี้เกียจครับ) เอาเป็นบอกปัญหาและวิธีแก้เลยละกันนะครับ
ปัญหา คือ มันไม่สามารถ parse ภาษาไทยได้ครับ (เฉพาะบาง server ที่มี setting อะไรบางไม่ปรกติ)
วิธีแก้ ก็ง่ายๆ ครับ.. ใช้คำสั่ง setlocale ครับ. ประมาณนี้
<?php setlocale ( LC_ALL, 'en_US.UTF-8' ); ... ... $fields = fgetcsv ( $fp , $maxlength , $separator ); ?>
ผมก็ยังไม่ได้ค้นคว้าเหมือนกันว่า มันมีตัวเลือกอะไรบ้าง และมีผลอย่างไร แต่เอาเป็นว่าให้ใช้งานได้พอครับ