2014年10月13日 星期一

php透過wkhtmltopdf動態產生PDF檔

在Ubuntu中執行wkhtmltopdf確定可以將某個網址轉成PDF後,接下來要在php裡做這件事.
  • php程式
<?php
$pdfFileName="google.pdf";
$htmUrl="http://www.google.com";

echo shell_exec('whoami');
$cmd = sprintf("xvfb-run -a wkhtmltopdf %s %s",$htmUrl,$pdfFileName);
$output = shell_exec($cmd);

echo sprintf("<pre>%s</pre>",$output);
?>
  • 檢視apache的error.log
tail -f /var/log/apache2/error.log

  • 給予php程式寫入檔案權限
若不知道php程式用什麼身份執行,可透過以下方式得知:
<?php 
 echo exec('whoami'); 
?>
如果以上程式執行的結果是www-data,就給予www-data寫入權限
sudo chown -R www-data /var/www/html/pdf_test
sudo chmod -R g+w /var/www/html/pdf_test

2014年9月29日 星期一

wkhtmltopdf:將網頁轉成pdf

這個程式只要給它一個url網址就可以轉成一個pdf檔。而且中文也沒有問題!
  • 安裝
以32位元的Linux (Ubuntu Trusty)為例,執行以下指令即可安裝:
sudo apt-get install wkhtmltopdf

如果是在Fedora上則用yum取代apt-get指令,如下:
sudo yum install wkhtmltopdf

如果以上安裝失敗,可能是沒有安裝git。則先執行以下指令,加裝git,再執行一次wkhtmltopdf的安裝即可:

sudo apt-get install git

  • 安裝xvfb 

錯誤訊息: wkhtmltopdf: cannot connect to X server

解決方式:
sudo app-get insall xvfb 

如果是在Fedora上則用取代指令如下:
sudo yum install xorg-x11-server-Xvfb


  • 執行
wkhtmltopdf http://web.url.to.test  file.pdf

如果是在Fedora上則用取代指令如下:

xvfb-run wkhtmltopdf   http://web.url.to.test  file.pdf


2014年9月28日 星期日

讓MySQL定期執行特定指令:Schedule Event

  • 檢視MySQL的event scheduler是否啟動
SHOW PROCESSLIST \G;

預設event scheduler 並沒有啟動,只會看到如下的結果:


  • 啟動event scheduler
SET GLOBAL event_scheduler = ON;

執行以上指令後,再檢視show processlist\G,可看到多了一個event_scheduler的Daemon。



  • 建立schedule event
CREATE EVENT EveryMinuteEvent
    ON SCHEDULE
      EVERY 1 MINUTE
    COMMENT '每分鐘執行一次'
    DO
      INSERT INTO  table1 (  field1 ) VALUES (NOW())

  • mysql 資料庫的 event 資料表
建立以上schedule event之後,可在mysql資料庫下的event資料表可看到新增一筆如下資料:


之後每過一分鐘在測試的資料表中將會看到新增一筆記錄當下時間的資料:


  • 停用schedule event
ALTER EVENT EveryMinuteEvent DISABLE;
  • 刪除schedule event
DROP EVENT EveryMinuteEvent;

2014年9月23日 星期二

PHP重點提示-給ASP.NET程式設計師

學習資源

http://www.w3schools.com/php/php_intro.asp

echo vs. print

echo可顯示多行,print只能顯示一行。
echo "第一行
第二行";

變數

以$宣告變數,變數名稱可由字母、底線及數字組成。不可以數字開頭。

變數名稱大小寫視為相

宣告時無需指定型別

可視範圍:local、global、static
函式中的變數為區域變數,不在函式中的變數則為全域變數。
函式中可用global關鍵字存取全域變數。
函式中可用static關鍵字宣告常存變數。

常數

皆為global,以define()定義常數。

資料型別

String, Integer, Float, Boolean, Array, Object, NULL
可用var_dump(...)顯示變數的型別及內含值

函式

以function關鍵字定義函式

名稱大小寫視為相

陣列

用$宣告陣列,用array(...)設定陣列內容

三種陣列:索引式陣列、key-value陣列、多維陣列

可透過函式依內含值、鍵值以升、降冪方式排序

PHP內建全域變數

$_SERVER、$_REQUEST...

表單輸入驗證

透過htmlspecialchars()處理html特殊字元
透過trim()、stripslashes()去除不必要字元
例如可宣告以下函式處理使用者的輸入值:

function replace_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}

日期時間

date("Y/m/d")可傳回14/09/22
可透過mktime(hour,minute,second,month,day,year)設定時間

include vs. require

兩者的差別在找不到指定檔案時:require會出錯並停止執行,include只產生警告程式仍繼續執行

檔案處理

readfile(...)可將指定檔案內容全部讀出,細部處理可透過fopen(...)、fclose(...)、feof(...)、fgets(...)等f開頭函式。

Cookie

寫入:setcookie("user", "Mary", time()+3600)
讀取:透過$_COOKIE全域變數存取,或可用print_r($_COOKIE)傾印所有cookie
透過isset()檢查特定cookie是否存在,如:isset($_COOKIE["user"])

Session

在<html>之前呼叫session_start()初始化,接著便可以$_SESSION['key']存取。最後呼叫session_destroy()。

錯誤處理

die("...")可在顯示錯誤訊息後中止執行。或可透過set_error_handler(...)函式指定錯誤處理函式。如下:

//error handler function
function customError($errno, $errstr) {
  echo "Error: [$errno] $errstr";
}

//set error handler
set_error_handler("customError");

//trigger error
echo($test);

執行結果:

Error: [8] Undefined variable: test

也有try...catch.