SlideShare a Scribd company logo
PIXNET如何使用PHP
Ronny Wang 王向榮

● PHP 開發經驗 12 年
● 現任 PIXNET 技術部副理
● 負責 Pix Framework 開發

Twitter: ronnywang
http://ronnywang.pixnet.net/blog
http://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];
PHP 5.4 - 直接呼叫新物件 method

● $a = new Foo(); $a->bar();
  ==> (new Foo())->bar();
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 + 3
  4
  >> $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 + top
84651 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/5289132
55391 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.pixnet
   ServerAlias *.pixnet.net.*.test.pixnet
   VirtualDocumentRoot /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.pixnet
   ServerAlias *.pixnet.net.*.staging.pixnet
   VirtualDocumentRoot /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
徵才

http://www.pixnet.net/career
techjob@pixnet.tw

● PHP/RoR 程式設計師
● Android/iOS 程式設計師

More Related Content

What's hot (20)

使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡
cachowu
 
Tornado开发实践
Tornado开发实践Tornado开发实践
Tornado开发实践
ZY Zhang
 
twMVC#42 讓我們用一種方式來開發吧
twMVC#42 讓我們用一種方式來開發吧twMVC#42 讓我們用一種方式來開發吧
twMVC#42 讓我們用一種方式來開發吧
twMVC
 
NodeJS基礎教學&簡介
NodeJS基礎教學&簡介NodeJS基礎教學&簡介
NodeJS基礎教學&簡介
GO LL
 
Nginx使用和模块开发
Nginx使用和模块开发Nginx使用和模块开发
Nginx使用和模块开发
qingpiao1983
 
Xml Lab 電腦&網路
Xml Lab 電腦&網路Xml Lab 電腦&網路
Xml Lab 電腦&網路
aecro
 
Maven & mongo & sring
Maven & mongo & sringMaven & mongo & sring
Maven & mongo & sring
Tzu Chi University
 
學好 node.js 不可不知的事
學好 node.js 不可不知的事學好 node.js 不可不知的事
學好 node.js 不可不知的事
Ben Lue
 
twMVC#44 讓我們用 k6 來進行壓測吧
twMVC#44 讓我們用 k6 來進行壓測吧twMVC#44 讓我們用 k6 來進行壓測吧
twMVC#44 讓我們用 k6 來進行壓測吧
twMVC
 
Nginx+常见应用技术指南
Nginx+常见应用技术指南Nginx+常见应用技术指南
Nginx+常见应用技术指南
andy54321
 
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
Will Huang
 
twMVC#32應用 ASP.NET WebAPI2 Odata 建置高互動性 APIS
twMVC#32應用 ASP.NET WebAPI2 Odata 建置高互動性 APIStwMVC#32應用 ASP.NET WebAPI2 Odata 建置高互動性 APIS
twMVC#32應用 ASP.NET WebAPI2 Odata 建置高互動性 APIS
twMVC
 
用最潮的 Java script 盡情開發 kde qt 程式
用最潮的 Java script 盡情開發 kde qt 程式用最潮的 Java script 盡情開發 kde qt 程式
用最潮的 Java script 盡情開發 kde qt 程式
Fred Chien
 
twMVC#43 C#10 新功能介紹
twMVC#43 C#10 新功能介紹twMVC#43 C#10 新功能介紹
twMVC#43 C#10 新功能介紹
twMVC
 
twMVC#30 | 你應該瞭解的 container-on-azure-二三事
twMVC#30 | 你應該瞭解的 container-on-azure-二三事twMVC#30 | 你應該瞭解的 container-on-azure-二三事
twMVC#30 | 你應該瞭解的 container-on-azure-二三事
twMVC
 
使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡
Cary Yang
 
使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡
guest2d0fe3
 
使用Nginx轻松实现开源负载均衡——对外版
使用Nginx轻松实现开源负载均衡——对外版使用Nginx轻松实现开源负载均衡——对外版
使用Nginx轻松实现开源负载均衡——对外版
pigso
 
twMVC#42 Windows容器導入由0到1
twMVC#42 Windows容器導入由0到1twMVC#42 Windows容器導入由0到1
twMVC#42 Windows容器導入由0到1
twMVC
 
[LaravelConf Taiwan 2018] 如何正確佈署 Laravel 專案
[LaravelConf Taiwan 2018] 如何正確佈署 Laravel 專案[LaravelConf Taiwan 2018] 如何正確佈署 Laravel 專案
[LaravelConf Taiwan 2018] 如何正確佈署 Laravel 專案
LaravelConfTaiwan
 
使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡
cachowu
 
Tornado开发实践
Tornado开发实践Tornado开发实践
Tornado开发实践
ZY Zhang
 
twMVC#42 讓我們用一種方式來開發吧
twMVC#42 讓我們用一種方式來開發吧twMVC#42 讓我們用一種方式來開發吧
twMVC#42 讓我們用一種方式來開發吧
twMVC
 
NodeJS基礎教學&簡介
NodeJS基礎教學&簡介NodeJS基礎教學&簡介
NodeJS基礎教學&簡介
GO LL
 
Nginx使用和模块开发
Nginx使用和模块开发Nginx使用和模块开发
Nginx使用和模块开发
qingpiao1983
 
Xml Lab 電腦&網路
Xml Lab 電腦&網路Xml Lab 電腦&網路
Xml Lab 電腦&網路
aecro
 
學好 node.js 不可不知的事
學好 node.js 不可不知的事學好 node.js 不可不知的事
學好 node.js 不可不知的事
Ben Lue
 
twMVC#44 讓我們用 k6 來進行壓測吧
twMVC#44 讓我們用 k6 來進行壓測吧twMVC#44 讓我們用 k6 來進行壓測吧
twMVC#44 讓我們用 k6 來進行壓測吧
twMVC
 
Nginx+常见应用技术指南
Nginx+常见应用技术指南Nginx+常见应用技术指南
Nginx+常见应用技术指南
andy54321
 
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
Will Huang
 
twMVC#32應用 ASP.NET WebAPI2 Odata 建置高互動性 APIS
twMVC#32應用 ASP.NET WebAPI2 Odata 建置高互動性 APIStwMVC#32應用 ASP.NET WebAPI2 Odata 建置高互動性 APIS
twMVC#32應用 ASP.NET WebAPI2 Odata 建置高互動性 APIS
twMVC
 
用最潮的 Java script 盡情開發 kde qt 程式
用最潮的 Java script 盡情開發 kde qt 程式用最潮的 Java script 盡情開發 kde qt 程式
用最潮的 Java script 盡情開發 kde qt 程式
Fred Chien
 
twMVC#43 C#10 新功能介紹
twMVC#43 C#10 新功能介紹twMVC#43 C#10 新功能介紹
twMVC#43 C#10 新功能介紹
twMVC
 
twMVC#30 | 你應該瞭解的 container-on-azure-二三事
twMVC#30 | 你應該瞭解的 container-on-azure-二三事twMVC#30 | 你應該瞭解的 container-on-azure-二三事
twMVC#30 | 你應該瞭解的 container-on-azure-二三事
twMVC
 
使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡
Cary Yang
 
使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡
guest2d0fe3
 
使用Nginx轻松实现开源负载均衡——对外版
使用Nginx轻松实现开源负载均衡——对外版使用Nginx轻松实现开源负载均衡——对外版
使用Nginx轻松实现开源负载均衡——对外版
pigso
 
twMVC#42 Windows容器導入由0到1
twMVC#42 Windows容器導入由0到1twMVC#42 Windows容器導入由0到1
twMVC#42 Windows容器導入由0到1
twMVC
 
[LaravelConf Taiwan 2018] 如何正確佈署 Laravel 專案
[LaravelConf Taiwan 2018] 如何正確佈署 Laravel 專案[LaravelConf Taiwan 2018] 如何正確佈署 Laravel 專案
[LaravelConf Taiwan 2018] 如何正確佈署 Laravel 專案
LaravelConfTaiwan
 

Viewers also liked (11)

TOSSUG HTML5 讀書會 新標籤與表單
TOSSUG HTML5 讀書會 新標籤與表單TOSSUG HTML5 讀書會 新標籤與表單
TOSSUG HTML5 讀書會 新標籤與表單
偉格 高
 
尼古丁加咖啡因,不瞌睡的简报設計模式 (Caffeine+Nicotine)
尼古丁加咖啡因,不瞌睡的简报設計模式 (Caffeine+Nicotine)尼古丁加咖啡因,不瞌睡的简报設計模式 (Caffeine+Nicotine)
尼古丁加咖啡因,不瞌睡的简报設計模式 (Caffeine+Nicotine)
Dahui Feng
 
版本控制 使用Git & git hub
版本控制   使用Git & git hub版本控制   使用Git & git hub
版本控制 使用Git & git hub
維佋 唐
 
Aggregation in MongoDB
Aggregation in MongoDBAggregation in MongoDB
Aggregation in MongoDB
Kishor Parkhe
 
Card sorting
Card sorting Card sorting
Card sorting
Charles (XXC) Chen
 
What Can Compilers Do for Us?
What Can Compilers Do for Us?What Can Compilers Do for Us?
What Can Compilers Do for Us?
National Cheng Kung University
 
High Performance JavaScript - WebDirections USA 2010
High Performance JavaScript - WebDirections USA 2010High Performance JavaScript - WebDirections USA 2010
High Performance JavaScript - WebDirections USA 2010
Nicholas Zakas
 
那些mockup沒告訴你的事@WebConf.tw 2013
那些mockup沒告訴你的事@WebConf.tw 2013那些mockup沒告訴你的事@WebConf.tw 2013
那些mockup沒告訴你的事@WebConf.tw 2013
Adam Wang
 
寫給大家的 Git 教學
寫給大家的 Git 教學寫給大家的 Git 教學
寫給大家的 Git 教學
littlebtc
 
[系列活動] Machine Learning 機器學習課程
[系列活動] Machine Learning 機器學習課程[系列活動] Machine Learning 機器學習課程
[系列活動] Machine Learning 機器學習課程
台灣資料科學年會
 
cPanel - Apache Global Configuration
cPanel - Apache Global ConfigurationcPanel - Apache Global Configuration
cPanel - Apache Global Configuration
skuver
 
TOSSUG HTML5 讀書會 新標籤與表單
TOSSUG HTML5 讀書會 新標籤與表單TOSSUG HTML5 讀書會 新標籤與表單
TOSSUG HTML5 讀書會 新標籤與表單
偉格 高
 
尼古丁加咖啡因,不瞌睡的简报設計模式 (Caffeine+Nicotine)
尼古丁加咖啡因,不瞌睡的简报設計模式 (Caffeine+Nicotine)尼古丁加咖啡因,不瞌睡的简报設計模式 (Caffeine+Nicotine)
尼古丁加咖啡因,不瞌睡的简报設計模式 (Caffeine+Nicotine)
Dahui Feng
 
版本控制 使用Git & git hub
版本控制   使用Git & git hub版本控制   使用Git & git hub
版本控制 使用Git & git hub
維佋 唐
 
Aggregation in MongoDB
Aggregation in MongoDBAggregation in MongoDB
Aggregation in MongoDB
Kishor Parkhe
 
High Performance JavaScript - WebDirections USA 2010
High Performance JavaScript - WebDirections USA 2010High Performance JavaScript - WebDirections USA 2010
High Performance JavaScript - WebDirections USA 2010
Nicholas Zakas
 
那些mockup沒告訴你的事@WebConf.tw 2013
那些mockup沒告訴你的事@WebConf.tw 2013那些mockup沒告訴你的事@WebConf.tw 2013
那些mockup沒告訴你的事@WebConf.tw 2013
Adam Wang
 
寫給大家的 Git 教學
寫給大家的 Git 教學寫給大家的 Git 教學
寫給大家的 Git 教學
littlebtc
 
[系列活動] Machine Learning 機器學習課程
[系列活動] Machine Learning 機器學習課程[系列活動] Machine Learning 機器學習課程
[系列活動] Machine Learning 機器學習課程
台灣資料科學年會
 
cPanel - Apache Global Configuration
cPanel - Apache Global ConfigurationcPanel - Apache Global Configuration
cPanel - Apache Global Configuration
skuver
 

Similar to 2012 php conf slide PIXNET 如何使用 php (20)

PHP & AppServ
PHP & AppServPHP & AppServ
PHP & AppServ
Ht Wang
 
Html01
Html01Html01
Html01
Ht Wang
 
Phpconf 2011 introduction_to_codeigniter
Phpconf 2011 introduction_to_codeigniterPhpconf 2011 introduction_to_codeigniter
Phpconf 2011 introduction_to_codeigniter
Bo-Yi Wu
 
Phalcon phpconftw2012
Phalcon phpconftw2012Phalcon phpconftw2012
Phalcon phpconftw2012
Rack Lin
 
Phalcon the fastest php framework 阿土伯
Phalcon   the fastest php framework 阿土伯Phalcon   the fastest php framework 阿土伯
Phalcon the fastest php framework 阿土伯
Hash Lin
 
第四章解答
第四章解答第四章解答
第四章解答
jiannrong
 
OpenWebSchool - 02 - PHP Part I
OpenWebSchool - 02 - PHP Part IOpenWebSchool - 02 - PHP Part I
OpenWebSchool - 02 - PHP Part I
Hung-yu Lin
 
PHP 語法基礎與物件導向
PHP 語法基礎與物件導向PHP 語法基礎與物件導向
PHP 語法基礎與物件導向
Shengyou Fan
 
網頁設計 - 概述
網頁設計 - 概述網頁設計 - 概述
網頁設計 - 概述
Vincent Chi
 
PHP vs 林克傳說
PHP vs 林克傳說PHP vs 林克傳說
PHP vs 林克傳說
Gene Hong
 
[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來
[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來
[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來
Shengyou Fan
 
Appserv setup
Appserv setupAppserv setup
Appserv setup
Ht Wang
 
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
Mu Chun Wang
 
網頁安全 Web security 入門 @ Study-Area
網頁安全 Web security 入門 @ Study-Area網頁安全 Web security 入門 @ Study-Area
網頁安全 Web security 入門 @ Study-Area
Orange Tsai
 
建立PHP & MySQL應用程式開發環境 - XAMPP安裝與測試
建立PHP & MySQL應用程式開發環境 - XAMPP安裝與測試建立PHP & MySQL應用程式開發環境 - XAMPP安裝與測試
建立PHP & MySQL應用程式開發環境 - XAMPP安裝與測試
吳錫修 (ShyiShiou Wu)
 
RESTful API Design
RESTful API DesignRESTful API Design
RESTful API Design
Amigo 陳兆祥
 
成為全能 php 攻城獅
成為全能 php 攻城獅成為全能 php 攻城獅
成為全能 php 攻城獅
Shengyou Fan
 
大獅子與小獅子的分享
大獅子與小獅子的分享大獅子與小獅子的分享
大獅子與小獅子的分享
jo lin
 
人多嘴雜乎?眾志成城乎?開放源碼軟體的使用體驗 by Bob Chao
人多嘴雜乎?眾志成城乎?開放源碼軟體的使用體驗 by Bob Chao人多嘴雜乎?眾志成城乎?開放源碼軟體的使用體驗 by Bob Chao
人多嘴雜乎?眾志成城乎?開放源碼軟體的使用體驗 by Bob Chao
悠識學院
 
COSCUP promoting in HP7
COSCUP promoting in HP7COSCUP promoting in HP7
COSCUP promoting in HP7
Bob Chao
 
PHP & AppServ
PHP & AppServPHP & AppServ
PHP & AppServ
Ht Wang
 
Phpconf 2011 introduction_to_codeigniter
Phpconf 2011 introduction_to_codeigniterPhpconf 2011 introduction_to_codeigniter
Phpconf 2011 introduction_to_codeigniter
Bo-Yi Wu
 
Phalcon phpconftw2012
Phalcon phpconftw2012Phalcon phpconftw2012
Phalcon phpconftw2012
Rack Lin
 
Phalcon the fastest php framework 阿土伯
Phalcon   the fastest php framework 阿土伯Phalcon   the fastest php framework 阿土伯
Phalcon the fastest php framework 阿土伯
Hash Lin
 
第四章解答
第四章解答第四章解答
第四章解答
jiannrong
 
OpenWebSchool - 02 - PHP Part I
OpenWebSchool - 02 - PHP Part IOpenWebSchool - 02 - PHP Part I
OpenWebSchool - 02 - PHP Part I
Hung-yu Lin
 
PHP 語法基礎與物件導向
PHP 語法基礎與物件導向PHP 語法基礎與物件導向
PHP 語法基礎與物件導向
Shengyou Fan
 
網頁設計 - 概述
網頁設計 - 概述網頁設計 - 概述
網頁設計 - 概述
Vincent Chi
 
PHP vs 林克傳說
PHP vs 林克傳說PHP vs 林克傳說
PHP vs 林克傳說
Gene Hong
 
[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來
[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來
[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來
Shengyou Fan
 
Appserv setup
Appserv setupAppserv setup
Appserv setup
Ht Wang
 
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
Mu Chun Wang
 
網頁安全 Web security 入門 @ Study-Area
網頁安全 Web security 入門 @ Study-Area網頁安全 Web security 入門 @ Study-Area
網頁安全 Web security 入門 @ Study-Area
Orange Tsai
 
建立PHP & MySQL應用程式開發環境 - XAMPP安裝與測試
建立PHP & MySQL應用程式開發環境 - XAMPP安裝與測試建立PHP & MySQL應用程式開發環境 - XAMPP安裝與測試
建立PHP & MySQL應用程式開發環境 - XAMPP安裝與測試
吳錫修 (ShyiShiou Wu)
 
成為全能 php 攻城獅
成為全能 php 攻城獅成為全能 php 攻城獅
成為全能 php 攻城獅
Shengyou Fan
 
大獅子與小獅子的分享
大獅子與小獅子的分享大獅子與小獅子的分享
大獅子與小獅子的分享
jo lin
 
人多嘴雜乎?眾志成城乎?開放源碼軟體的使用體驗 by Bob Chao
人多嘴雜乎?眾志成城乎?開放源碼軟體的使用體驗 by Bob Chao人多嘴雜乎?眾志成城乎?開放源碼軟體的使用體驗 by Bob Chao
人多嘴雜乎?眾志成城乎?開放源碼軟體的使用體驗 by Bob Chao
悠識學院
 
COSCUP promoting in HP7
COSCUP promoting in HP7COSCUP promoting in HP7
COSCUP promoting in HP7
Bob Chao
 

2012 php conf slide PIXNET 如何使用 php

  • 2. Ronny Wang 王向榮 ● PHP 開發經驗 12 年 ● 現任 PIXNET 技術部副理 ● 負責 Pix Framework 開發 Twitter: ronnywang http://ronnywang.pixnet.net/blog http://github.com/ronnywang
  • 3. PIXNET Web 環境 ● git ● Framework ● log ● proctitle ● 開發流程
  • 4. PIXNET 現在環境 ● FreeBSD 8.3 ○ ports 管理 VirtualHost 設定 ● Apache 2.2 (worker) ● PHP 5.3 with fpm
  • 6. PHP 5.3 - anonymous function $quote_func = function($str) { return ""{$str}""; }; $quoted_array = array_map( $quote_func, $array );
  • 7. 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, ));
  • 9. 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];
  • 10. PHP 5.4 - 直接呼叫新物件 method ● $a = new Foo(); $a->bar(); ==> (new Foo())->bar();
  • 11. PHP 5.4 - 直接用回傳值的 array ● $a = func(); $a[3]; ==> func()[3];
  • 12. PHP 5.4 - development web server ● php -S 0.0.0.0:12345 index.php ● 開http://localhost:12345
  • 13. Git - gitolite https://github.com/sitaramc/gitolite ● 權限管理方便(clone 出 gitolite-admin 即可) ● $GL_PACKAGE_HOOKS 管理 hook template
  • 14. Git - php syntax check ● php -l (--syntax-check) ● https://github. com/phpbb/phpbb3/blob/develop- olympus/git-tools/hooks/pre-commit
  • 15. Framework ● Zend Framework 1.5.3 (現 2.0.0) ○ http://framework.zend.com/ ● Pix Framework ○ http://framework.pixnet.net/
  • 16. Framework 好處 ● 網站設定位置統一 ○ 測試環境好建立 ● 容易在網頁產生開始結束增加事件 ○ 記錄產生時間 ○ 處理錯誤訊息
  • 17. Framework - model ● PIXNET 的 ORM Pix_Table ○ 有用 MySQL, PostgreSQL, SQLite, Cassandra ,用法一模一樣 ○ 測試時用 SQLite 的 :memory: ○ 記錄時間較長的 query ,方便找出系統瓶頸 http://framework.pixnet.net/ 有 OSDC 的 Pix_Table slide
  • 18. Pix Framework - Pix_Prompt ● https://github.com/pixnet/pixframework- heroku/blob/master/prompt.php ● > php prompt.php >> echo 1 + 3 4 >> $user = User::find('ronnywang'); >> echo count($user->articles) 358 >>
  • 19. 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 正在處理哪些網 址
  • 20. Framework - pecl-proctitle + top 84651 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/5289132 55391 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
  • 21. PHP Log ● php.ini 設定 error_log 位置 ● 用 logrotate 只留三天內 log
  • 22. PHP Log - IRC ● PIXNET 所有 web 主機的 PHP Error, Warning 都會噴到一個 IRC 上面 ● 可參考http://github.com/ronnywang/heroku- ircbot/
  • 23. 開發/測試/上線 ● 以網址區隔 ● 線上: http://ronnywang.pixnet.net/blog 開發: http://ronnywang.pixnet.net.srwang.test. pixnet/blog 測試: http://ronnywang.pixnet.net.12345.staging. pixnet/blog
  • 24. 線上環境 ● 用 rsync 將程式碼推上 web 機器 ● rsync over ssh 權限管理 ● 用 netgroup 管理目標主機
  • 25. 開發環境 ● 把線上網址後面加上 .[開發者].test.pixnet ● 利用 Apache VirtualDocumentRoot 依照不同 網址連到不同資料夾 <VirtualHost *:80> ServerName pixnet.net.admin.test.pixnet ServerAlias *.pixnet.net.*.test.pixnet VirtualDocumentRoot /home/user/%-3/pixfront/webroot </VirtualHost>
  • 26. 開發環境 ● VirtualDocumentRoot 直接設定在開發者家目 錄,開發者存檔後直接重新整理就可以看結果 ● .pixnet 是只有內部網路可以用的 domain , 不是花幾百萬買來的 Root TLD,若無技術人 力可以自己維護 DNS ,可以另開個網址來做 這件事
  • 27. 測試環境 ● 把線上網址後面加上 .[issue #].staging.pixnet ● Git 要有對應的 issueXXX 的 remote branch ● deploy script 發現現在在 issueXXX 的 git branch ,就把 code 改推到測試環境 (Ex: 測試主機的 /srv/staging/{issue}/{project}) ● 搭配 VirtualDocumentRoot
  • 28. 測試環境 <VirtualHost *:80> ServerName pixnet.net.admin.staging.pixnet ServerAlias *.pixnet.net.*.staging.pixnet VirtualDocumentRoot /srv/staging/%-3/pixfront/webroot </VirtualHost>
  • 29. 產品開發流程 ● 任何新產品開發,修 bug 都要在 issue system 開 issue ,得到一個 issue number ● 負責的程式設計師在 .[account].test.pixnet 的 環境下開發,並在 git 開一個 issueXXX 的 branch ● 完成到可 demo 的程度,就 deploy 到測試環境 .[issue #].staging.pixnet 並給其他人測試
  • 30. 產品開發流程 ● 等到確認無問題後,將 issueXXX merge 進 master,並且可以 deploy 到正式環境 ● 完工!
  • 31. Q&A