Archive for the 'PHP' Category

使用PHP將JPG轉換成PDF檔

最近需要將許多個很大張的jpg檔案合併成單一個pdf檔案,實在懶的只為了這個原因就特地安裝任何一套轉換pdf的軟體,外加這些jpg檔其實都放在遠端的機器上面,想到還要抓回來本機端處理就很麻煩,還得浪費自己電腦的運算資源,就在這個想法下,突然想起大四時曾經有使用過fpdf這個PHP的Library,能夠非常方便的製作pdf檔案,不但可以在遠端的機器上面完成所有的事情,還可以善用遠端威猛的運算資源 :P 整理步驟如下:

  1. 下載最新的fpdf,並且解壓縮取出fpdf.php
  2. 編寫下列程式碼,這邊是原始碼

<?
 require('fpdf.php');
 $pdf = new FPDF();

 $d=dir('.');
 while(($file=$d->read())!=false)
 {
  if(substr($file,-4)!=".jpg") continue;
  $pdf->AddPage();
  $pdf->Image($file,0,0,220);
 }
 $d->close();
 $pdf->Output("output.pdf");
?>

最後產出的output.pdf就是我要的檔案啦!

簡單解說一下,關鍵只有一段$pdf->Image,後面的引數第一個是要匯入的jpg檔案,第二跟第三個則是代表圖片左上角的定位,最後一個則是設定圖片的寬度,沒有長度的原因是該library會自動調整長度。

你還在PHP裡面使用srand()嗎?

念資工的人多數都是由C語言起家的,只要計概教到亂數產生的function時,授課老師總是會耳提面令的提醒著要記得使用srand()來產生一個random seed,否則每次跑出來的亂數都會是相同的,相信大家應該都有這段的印象才是。

於是,當我開始寫PHP後,也自然而然的將這個習慣套用進來,總是習慣先使用srand()產生亂數種子後,再用rand()產生亂數,直到前幾天,我亂翻PHP的Manual才在srand()說明頁看到下面這句話:

Note: As of PHP 4.2.0, there is no need to seed the random number generator with srand() or mt_srand() as this is now done automatically.

原來PHP 4.2.0以後,使用亂數前已經不用先指定產生亂數種子了,它會自動的幫你產生,所以自己多做無謂的事情已經有一段時間了 Orz~,雖然少這行呼叫對程式效率也不會有任何提升,但是能少打點字還是不賴啦,如果你有看到這篇文章,記得下次在寫PHP時可以直接呼叫rand()喔!

簡單實作PHP圖片驗證

手邊有個服務需要圖片驗證(captcha)的功能,所以翻了一下之前寫的code,順便整理一下跟大家分享。這邊的code是產生出來的圖片是最簡單的樣式,僅是四個亂數產生的字母(有字母可能重複),外加上一些黑點雜訊來增加辨識上難度,為了避免黑點干擾造字母的辨識困難,我剔除掉一些長相相近的字母,希望增加使用者輸入正確的機率,畢竟圖片驗證是要拿來擋機器人而不是拿來刁難真正的人類阿。

Continue reading ‘簡單實作PHP圖片驗證’

當apache的errorlog出現configured request variable name length limit exceeded

之前在寫Picasa2Wordpress的時候,測試的時候,遇到一個詭異的問題,在我有權限能access的機器們上面跑,就是有一台跑不起來,後來查了一下apache2的log才發現,原來是php suhosin module的問題,預設最大的POST及GET變數名稱最大只能夠是64字元,但是Picasa POST出去的卻遠超過,所以就被檔下來了。

解決方法很簡單,編輯/etc/php5/apache2/conf.d/suhosin.ini,加上下面這三行即可:

suhosin.request.max_varname_length=128
suhosin.get.max_name_length=128
suhosin.post.max_name_length=128

搞定收工。

每日自動彙整Plurk至BBS及信箱

我是一個重度的BBS使用者,之前在Vexed大神的引薦下開始使用Plurk,每天在plurk上面亂撲後,總是希望能夠每天plurk後整理一份到BBS上面記錄(我承認我還蠻無聊的,想要備份每天的胡言亂語)。所以就著手寫了一份自娛娛人,跑了快一個月看起來應該沒甚麼問題,於是就放出來跟各位分享。(因為一開始沒打算丟出來,所以code寫得有點亂,還請見諒) Continue reading ‘每日自動彙整Plurk至BBS及信箱’

How to use rtgui with PHP4

rtorrent是unix下面一個lightweight but powerful的BT Client. 跟許多console mode軟體不同的是, 他提供完整的xmlrpc api讓developer可以開發自己的interface來管理使用rtorrent.

我選用了rtgui, 本來以為只要幾分鐘就可以設定好, 沒想到卻遇到不能預期的錯誤, trace一下才發現原來是 file_get_contents這個function在PHP 5.0.0以後才support $context這個參數.

所以只好自己用curl hack一個給PHP < 5.0.0可以動的版本. (需要有curl extension) 目前用起來是沒遇到任何問題, 搞定收工.

Here is the hack (把functions.php裡面的do_xmlrpc整段換成):


function do_xmlrpc($request) {
   global $rpc_connect;
   if (version_compare(PHP_VERSION, '5.0.0', '>=')) {
      $file = file_get_contents($rpc_connect, false, $context);
   }else if(version_compare(PHP_VERSION, '5.0.0', '<') &amp;&amp;
                extension_loaded('curl')){
      $c = curl_init();
      $post_data = array('content' => $request);
      curl_setopt($c, CURLOPT_URL, $rpc_connect);
      curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($c, CURLOPT_POSTFIELDS, $request);
      curl_setopt($c, CURLOPT_TIMEOUT, 5);
      curl_setopt($c, CURLE_OPERATION_TIMEOUTED, 5);
      $file = curl_exec($c);
      curl_close($c);
   }else{
       die ("<h1>Please use PHP 5+ or enable cURL extension :) </h1>");
   }
   $file=str_replace("i8","double",$file);

   return xmlrpc_decode($file);
}