在 ptt 的 php 版,有時會看到有高手棄用 exec 呼叫 convert
自己慢慢啃 api 來寫 imagick 的操作~
今天花了些時間,研究了一下 php-pecl-imagick,總算也有一點心得
原來你在網路上找到的 php 使用的 imagick ,指的就是 php-pecl-imagick 這套件
php-pecl-imagick-3.0.0-9.fc11.i586
並不是 php-magickwand.i686
二者語法差滿多的 Orz
之前是伺服器裡裝的是 magickwand,害我一直在試
$dst=new Imagick($file_name);
想說明明就有灌,怎都不能用Orz
之後裝好了 php-pecl-imagick,結果發現圖片是能縮了,但cpu不停的100%
我讀了四張圖,cpu跑出4個 httpd 100~300% 差點嚇死…
而且沒有任何錯誤訊息警告...
我只好再把所有的 code 全拆掉,一行一行試
$file_name=$_GET['file_name']; //沒事(廢話)
$dst=new Imagick($file_name); //沒事
$dst->thumbnailImage(100,100,true); //爆點
真奇怪,正常縮圖的寫法,居然讓cpu炸了
讓我對自由軟體真是又喜歡又生氣…
於是開始花時間找 imagick cpu loading , thumbnailImage loading , thumbnailImage cpu ...
查了半天,查到一個 libgomp
http://www.webhostingtalk.com/archive/index.php/t-1002911.html
於是 yum install -y libgomp
裝了一堆 c++ 的東西,結果啥事都沒發生
於是我修改了一下程式,改用程式碼來試,不然網頁看的到的errorlog實在太有限
<?
//test.php
$file_name=$argv[1];
$dst=new Imagick($file_name);
$dst->thumbnailImage(100,100,true);
?>
測試~ php test.php 3wa.png
結果只有一行 記憶體區段錯誤
然後重新下載 php-pecl-imagick 的 srpm 回來重編
yumdownloader --source php-pecl-imagick
rpm -Uvh php-pecl-imagick-3.0.0-9.fc15.src.rpm
cd ~/rpmbuild/SPECS
rpmbuild -ba php-pecl-imagick
結果跑出一堆 pecl 的錯誤...
全都是 記憶體區段錯誤
查看看 dmesg
php[11016]: segfault at bfa01000 ip 00418077 sp bf9fa788 error 6 in libc-2.13.90.so[39c000+187000]
發現了 libc-2.13.90.so 有錯誤~
於是我在 /lib 下發現了這個檔案
rpm -qf /lib/libc-2.13.90.so
glibc-2.13.90-1.i686
在很不想更新這玩意的情況下,我更新了 glibc
yum install -y glibc
經過幾10mb的下載後…
pecl 正常了,可以執行了,但cpu loading 的問題仍未解決,重開httpd也無效
再重編 php-pecl-imagick 然後直接安裝自己編過的這版本的rpm後,總算解決了
---以上一堆題外話---
也把之前那支縮圖程式重新用 imagick 寫過
舊的縮圖 small.php
http://3wa.tw/photo/small.php?w_size=980&compassion=85&file_name=users/shadow/20110209_022145_8.jpg
然後新的縮圖 new_small.php
http://3wa.tw/photo/new_small.php?w_size=980&compassion=85&file_name=users/shadow/20110209_022145_8.jpg
總之大致上該有的功能都作到了,像是半透明字體、縮圖、快取~
然後加了個鬼鬼防錯誤情況發生~XD
其實我發現 GD 還是比較快~
同樣一張圖,0.0x 秒 vs 0.xx 秒
履試不爽了
不過我的 GD 是用
imagecopyresized($dst,$src,0,0,0,0,
$new_s_width,$new_s_heigth,
$cur_width,$cur_height) or die("error!\n");
//畫質雖好,但太慢
//imagecopyresampled($dst,$src,0,0,0,0,
// $new_s_width,$new_s_heigth,
// $cur_width,$cur_height) or die("error!\n");
如果改用 imagecopyresampled 畫質雖然好很多,但每張未讀過的圖,都會慢到 1.xx 秒以上…
目前的 GD 版本,全新圖是 0.1x~0.2x 秒,快取後都幾乎都是 0.03 秒
總之~如果改天我網站爆到每天上千人瀏覽,我再考慮改用 ImageMagick 做好了
必竟用 gd 在同一個 thread 下,浪費太多單一線 cpu 資源,分配給 im 應該就可以再多工些
題外話...
正常使用下,不應該看到鬼鬼的照片啦...
下一頁有鬼鬼,有被嚇到,或有心血管疾病的,請勿看第二頁資料內容....
看到就算了,嚇習慣後就覺得沒什麼了 XD