2012 php conf slide pixnet 如何使用 php
TRANSCRIPT
PIXNET如何使用PHP
Ronny Wang 王向榮
● PHP 開發經驗 12 年● 現任 PIXNET 技術部副理● 負責 Pix Framework 開發
Twitter: ronnywanghttp://ronnywang.pixnet.net/bloghttp://github.com/ronnywang
● PIXNET Web 環境● git● Framework● log● proctitle● 開發流程
PIXNET 現在環境
● FreeBSD 8.3○ ports 管理 VirtualHost 設定
● Apache 2.2 (worker)● PHP 5.3 with fpm
PHP 5.3 用到功能
PHP 5.3 - anonymous function
$quote_func = function($str) { return "\"{$str}\"";};
$quoted_array = array_map( $quote_func, $array);
PHP 5.3 - get_called_class
class User extends Pix_Table { }class Article extends Pix_Table { }
// 以下寫法在 PHP 5.3 以前做不到$user = User::find('ronnywang');$articles = Article::search(array( 'author_id' => $user->id,));
PHP 5.4 升級中
PHP 5.4 - array 簡寫
● $list = array(1, 2, 3);==> $list = [1, 2, 3];
● $list = array();==> $list = [];
● $list = array('one' => 1, 'two' => 2);==> $list = ['one' => 1, 'two' => 2];
● $a = new Foo(); $a->bar();==> (new Foo())->bar();
PHP 5.4 - 直接呼叫新物件 method
PHP 5.4 - 直接用回傳值的 array
● $a = func(); $a[3];==> func()[3];
PHP 5.4 - development web server
● php -S 0.0.0.0:12345 index.php● 開http://localhost:12345
Git - gitolite
https://github.com/sitaramc/gitolite● 權限管理方便(clone 出 gitolite-admin 即可)● $GL_PACKAGE_HOOKS 管理 hook template
Git - php syntax check
● php -l (--syntax-check)● https://github.
com/phpbb/phpbb3/blob/develop-olympus/git-tools/hooks/pre-commit
Framework
● Zend Framework 1.5.3 (現 2.0.0)○ http://framework.zend.com/
● Pix Framework○ http://framework.pixnet.net/
Framework 好處
● 網站設定位置統一○ 測試環境好建立
● 容易在網頁產生開始結束增加事件○ 記錄產生時間○ 處理錯誤訊息
Framework - model
● PIXNET 的 ORM Pix_Table○ 有用 MySQL, PostgreSQL, SQLite, Cassandra
,用法一模一樣○ 測試時用 SQLite 的 :memory:○ 記錄時間較長的 query ,方便找出系統瓶頸
http://framework.pixnet.net/ 有 OSDC 的 Pix_Table slide
Pix Framework - Pix_Prompt
● https://github.com/pixnet/pixframework-heroku/blob/master/prompt.php
● > php prompt.php>> echo 1 + 34>> $user = User::find('ronnywang');>> echo count($user->articles)358>>
Framework - 搭配 pecl-proctitle
● http://pecl.php.net/package/proctitle● void setproctitle(string $title);● Ex:
setproctitle("Web: {$_SERVER['SERVER_NAME']}{$_SERVER['REQUEST_URI']}");
● 可搭配 ps, top 來看目前 PHP 正在處理哪些網址
Framework - pecl-proctitle + top84651 www 1 4 0 436M 99M sbwait 9 3:35 8.06% php-fpm: PixFront: nymtzh.pixnet.net/blog (php-fpm)31006 www 1 4 0 420M 90248K accept 12 2:47 7.76% php-fpm: PixFront: null (php-fpm)66715 www 1 4 0 420M 89584K accept 0 1:00 7.76% php-fpm: PixFront: null (php-fpm)30577 www 1 4 0 420M 91448K accept 7 2:43 7.47% php-fpm: PixFront: null (php-fpm)77276 www 1 50 0 426M 95000K CPU9 9 4:32 7.37% php-fpm: PixFront: seohyun2100.pixnet.net/blog/post/528913255391 www 1 4 0 420M 91004K accept 8 3:27 7.28% php-fpm: PixFront: null (php-fpm)92126 www 1 4 0 420M 89644K accept 3 1:07 6.98% php-fpm: PixFront: go3d.pixnet.net/blog/plugindata/albumsho
41475 www 1 50 0 429M 97312K select 12 0:19 6.98% php-fpm: PixFront: ice2006.pixnet.net/blog/post/21929859-12
PHP Log
● php.ini 設定 error_log 位置● 用 logrotate 只留三天內 log
PHP Log - IRC
● PIXNET 所有 web 主機的 PHP Error, Warning 都會噴到一個 IRC 上面
● 可參考http://github.com/ronnywang/heroku-ircbot/
開發/測試/上線
● 以網址區隔● 線上: http://ronnywang.pixnet.net/blog
開發: http://ronnywang.pixnet.net.srwang.test.pixnet/blog測試:http://ronnywang.pixnet.net.12345.staging.pixnet/blog
線上環境
● 用 rsync 將程式碼推上 web 機器● rsync over ssh 權限管理● 用 netgroup 管理目標主機
開發環境
● 把線上網址後面加上 .[開發者].test.pixnet● 利用 Apache VirtualDocumentRoot 依照不同
網址連到不同資料夾<VirtualHost *:80>
ServerName pixnet.net.admin.test.pixnetServerAlias *.pixnet.net.*.test.pixnetVirtualDocumentRoot /home/user/%-3/pixfront/webroot
</VirtualHost>
開發環境
● VirtualDocumentRoot 直接設定在開發者家目錄,開發者存檔後直接重新整理就可以看結果
● .pixnet 是只有內部網路可以用的 domain ,不是花幾百萬買來的 Root TLD,若無技術人力可以自己維護 DNS ,可以另開個網址來做這件事
測試環境
● 把線上網址後面加上 .[issue #].staging.pixnet● Git 要有對應的 issueXXX 的 remote branch● deploy script 發現現在在 issueXXX 的 git
branch ,就把 code 改推到測試環境(Ex: 測試主機的 /srv/staging/{issue}/{project})
● 搭配 VirtualDocumentRoot
測試環境
<VirtualHost *:80>ServerName pixnet.net.admin.staging.pixnetServerAlias *.pixnet.net.*.staging.pixnetVirtualDocumentRoot /srv/staging/%-3/pixfront/webroot
</VirtualHost>
產品開發流程
● 任何新產品開發,修 bug 都要在 issue system 開 issue ,得到一個 issue number
● 負責的程式設計師在 .[account].test.pixnet 的環境下開發,並在 git 開一個 issueXXX 的 branch
● 完成到可 demo 的程度,就 deploy 到測試環境 .[issue #].staging.pixnet 並給其他人測試
產品開發流程
● 等到確認無問題後,將 issueXXX merge 進 master,並且可以 deploy 到正式環境
● 完工!
Q & A