顯示文章

這裡允許您檢視這個會員的所有文章。請注意, 您只能看見您有權限閱讀的文章。


主題 - ricky

頁: [1] 2
1
好康報報 / PHP 也有 Day 開講嘍
« 於: 2013-07-09 11:22 »
PHP 也有 Day 開講嘍...
這次我們請到了 Jace Ju(大澤木小鐵) 來跟大家介紹 Composer
有興趣的朋友們可以一同來參與嘍

時間 2013/08/01(四) 19:00 ~ 21:00
地點 台大新創育成中心一樓會議室 地址: 台北市中正區思源街18號

報名網址
http://registrano.com/events/88d096

2
PHP程式設計討論區 / Symfony 讀書會
« 於: 2013-05-14 09:56 »
各位,我們成立了一個 Symfony 的讀書會。
如果各位對 Symfony Framework 有興趣想一起學習的朋友,可以一同參與嘍。

https://www.facebook.com/groups/332091706917396/


3
剛剛在 Facebook 上收到這個訊息




4
工作機會 / 徵PHP工程師
« 於: 2013-01-10 09:31 »
http://goo.gl/k9GJf

 這是一個有趣又充滿挑戰的工作~
我們需要有熱忱並熟悉LAMP架構(如熟codeigniter加分噢!!)的程式設計師, 除了專業能力之外, 要能
1. 規劃建議: 拿出自己的真本事, 對系統與程式架構提出自己的規劃見解
2. 解決問題: 發揮不認輸的精神, 想辦法找出答案
3. 時間掌控: 自發性的時間管理, 時間內達到目標
4. 好學多問: 對新技術充滿興趣, 隨時有想法被顛覆的準備
5. 團結合群: 有團隊向心力, 一起衝鋒陷陣

你有以上的的特點嗎? 有自信接受挑戰嗎? 歡迎加入悠邁的行列.

5
PHP程式設計討論區 / PHPConf 2012 影片出來嘍
« 於: 2012-11-28 18:27 »
影片公佈嘍,沒有參與的朋友們可以看看事後錄影嘍。  ;D

http://phpconf.tw/2012/topics.html

6
PHP程式設計討論區 / PHPConf TW 2011 開跑嘍
« 於: 2011-08-29 19:24 »
怎麼冒出來的請參考這個討論: https://groups.google.com/forum/#!topic/zf-tw/O1nWdjtYfuA

目前正在募集工作人員以及講題,有興趣的朋友請在這兒登記:
https://docs.google.com/document/d/14UPkNFzpVjvf2yQh5Au-wAheDfagBZD2SzsLFc4Of5o/edit?hl=zh_TW

活動網站上線嘍

http://phpconf.tw/

7
PHP程式設計討論區 / PHP的重大安全更新
« 於: 2011-01-07 15:23 »
php在今天丟出了5.2.17 以及 5.3.5 兩個版本。
主要是修正一個浮點數瑕疵的bug,會導致系統整個Hang住。
這個問題只有在x86 32bit的系統上才會有問題,64bit不受影響。

要測試系統有沒有這個bug,只要在php程式中加上
$f=2.2250738585072011e-308;
如果程式跑不完的話,那就恭喜,趕快更新吧。

這個問題之所以嚴重是因為,系統經常會把User送過來的變數拿來作運算。
像這樣

$Total=$_GET['n']*$UnitPrice;

這時候攻擊者只需送入 xxx.php?n=2.2250738585072011e-308
系統就會整個Hang住嘍。

8
雜七雜八 / 幫忙測試聊天室
« 於: 2010-08-31 17:35 »
最近用php搭配node.js寫了一個聊天室
運用了comet技術(facebook跟噗浪都是用此種方式),
理論上在你送出訊息的同時,其他的User也應該會同時收到。
有沒有哪位善心人士可以幫忙測試一下嘍

http://chatroom.ez2.us/r/ricky


9
* Sinatra 是個輕量快速的 WEB 開發框架,本次議程將介紹如何將現有的 Rails 專案中需要強化的部份轉移到 Sinatra 上。
* Plug 是個能快速分享 3D 場景,並進行多人互動的平台環境。本議程將介紹 Plug 底層採用的兩個技術︰VAST 及 FLoD,並分享 Plug 目前採用的開發法(Scrum)。歡迎對虛擬世界感興趣的同好一起來交流。

Time 活動時間:        2010.05.21 14:00  ~  17:00
Location 活動地點:    中央研究院 資訊科學研究所 101室

有興趣的人可以來聽聽喔
http://whoswho.openfoundry.org/workshop/details/87-open-sinica--sinatra-plug.html

10
Dear 各位想參加的朋友們,

由於小弟才從上海回來,這件事有點拖延,目前計畫每兩週舉行一次,舉行的資訊如下:

時間: 2010.3.22 19:00 ~ 21:00
地點:台北市思源街18號 台大育成中心1樓公用會議室
主題:初探 Symfony

歡迎大家前來參加!
還有如果有興趣想來當講師的朋友們,可以的話請寄信給我您想講的主題,我再安排時間

 Regards,
Max Feng 馮君豪 maxfeng at winjet點com點tw
緯捷科技

報名網址
https://spreadsheets.google.com/viewform?formkey=dHNDeENqOHM2R3pnUmRsVC1mUk9IZXc6MA


12
此篇主題已經被移動到 [網頁技術版].

本版是php相關討論,Javascript的問題請到網頁技術討論。

http://phorum.study-area.org/index.php?topic=57604.0

13
好康報報 / YOMOpets寵物誌上線嘍
« 於: 2009-07-08 16:01 »
 ;D YOMOpets寵物誌正式上線嘍
幫自家網站打個廣告
不管是有沒有寵物的人都可以來這邊交流喔!

http://www.yomopets.com/


15
工作機會 / php 程式設計師 [新店]
« 於: 2008-11-04 13:41 »
工作地點: 新店 二高新店交流道附近
薪資:面議 (因為我不是老闆,看你如何跟老闆談嘍)
職務: PHP 程式設計師

工作要求:
PHP:懂MVC,過去曾參與專案並且能提供作品者尤佳。
  MVC不懂沒關係,zf讀書會 歡迎您,
  但是一定要懂PHP,如果通通都不懂 這裡 是您學習的好天地

Linux:熟悉基本系統操作
  千萬不要看到 $ 就打退堂鼓,要是哪天你非得用到 # 我們會很擔心

需具備基本英文閱讀能力,能看的懂技術文件
  PHP官網的文件總得看得懂吧

我們是一個熱情有活力的公司,歡迎您加入我們的行列。
有興趣的人請PM給我吧

16
好康報報 / F1上海站觀賽團
« 於: 2008-09-16 13:54 »
小弟的公司最近在推F1上海站的觀賽團
晚上還可以參加車隊的慶功宴
與車手作面對面的近距離接觸
本團由體育台主播Robin親自帶隊
有興趣的F1車迷們千萬別錯過這次難得的機會喔
活動網址
http://www.omycar.com.tw/f1_event.php

17
先說在前頭
這篇只是希望提供一個不同的思考方式
並非全盤否定Smarty這類樣板引擎的存在意義
但如果你懂得如何用php的樣板語法,你的程式碼與樣板頁也可以弄得很 "Smarty"
以下就針對Smarty中的一些常用語法來作對比吧

引用
<?php
require_once("Smarty.class.php");
$tpl=new Smarty;
$tpl->assign("Title",'this is a test!');
$tpl->assign("Name",'Ricky');
$tpl->assign('Sex','M');
$tpl->display('hello.htm');
?>

樣板
引用
<html>
<head>
<title>{$Title}</title>
</head>
<body>
Hey {if $Sex=='M'}boy{else}girl{/if}:{$Name}
</body>
<html>

要達到上面的樣板與程式碼分離的效果
只需善用php的語法也可以達到同樣的目的

引用
<?php
$tpl['Title']='this is a test!';
$tpl['Name']='Ricky';
$tpl['Sex']='M';
include_once('hello.htm');
?>

樣板
引用
<?extract($tpl)?>
<html>
<head>
<title><?=$Title?></title>
</head>
<body>
Hey <?if($Sex=='M'):?>boy<?else:?>girl<?endif?>:<?=$Name?>
</body>
<html>

有沒有發覺
其實善用php的基本語法
php程式也是可以很Smart的

下面就簡單的列一些php在樣板應用的變形語法
當某個敘述結尾是?>時敘述結尾的;是可以被省略的
<?php echo $xxx;?>                   =>       <?=$xxx?>   
if(...){...} elseif(...){...} else{...}  =>      <?if(...):?> .... <?elseif(...):?> .... <?else:?> .... <?endif?>
for(...){...}                          =>       <?for(...):?> ... <?endfor?>
foreach(...){...}                     =>       <?foreach(...):?> ... <?endforeach?>
while(...){...}                        =>       <?while(...):?> ... <?endwhile?>

18
PHP程式設計討論區 / 跨網域的Session傳遞
« 於: 2008-06-09 11:27 »
session或是cookie要跨網域傳遞 例如 a.example.com 設定的session要讓 b.example.com讀取時
在IE預設的安全等級中是會被禁止,除非將網址加入信任的網域中
可以透過P3P去解決(使用上很麻煩,還得自訂XML)
所幸php提供了解決方法
在呼叫sessionstat()之前
透過session_set_cookie_params宣告允許session傳遞的網域
像這樣
<?php
session_set_cookie_params(0,'/','.example.com'); //將*.example.com宣告為session允許傳遞的範圍
session_start();
...
...
...
?>

19
PHP程式設計討論區 / 資料庫正規化
« 於: 2008-05-13 15:02 »
要寫出一個好的網頁程式並不容易
除了資料的傳遞方式(GET/POST),頁面的串接,php的語法,SQL語法都得熟悉外
最重要的當然就是資料庫規劃了
不懂的如何規劃,那保證什麼專案都寫不出來
(曾遇過某個天才把所有的欄位統統擺在一個表格內,對每個欄位統統建index來加速)
要如何規劃出一個資料庫呢?
就是這篇的主題了--資料庫正規化

資料庫正規化的目的在於消除重複的資料欄位,確保資料的一致性。
一般來說大概都只會做到第三正規化,所以這邊就只討論到此嘍
正規化只是提供一個資料庫設計的準則,並不是一個強制性的規定,有時為了效能,會做反正規劃的動作

就功能性來區分
第一正規化消除重複資料群,定義出唯一的索引值
第二正規化根據表格的功能性,將不相干的欄位分離
第三正規化根據遞移關係,將欄位分離

第一正規化
引用
第一正規化的幾個規則
  • 一個row就只能陳述一件事
  • 每個row都必須有一個唯一的識別(主鍵)
  • 每個欄位只能陳述一個事情
  • 不能用多個欄位陳述同一見事實

以下是幾個違反的例子

訂單資料
訂單ID商品ID購買數量
12,3,41,3,5
21,5,9,1010,20,1,3
訂單1裡面購買了ID為2的商品,買了1個。
訂單1裡面購買了ID為3的商品,買了3個。
訂單1裡面購買了ID為4的商品,買了5個。
這違反了一個row就只能陳述一件事這條規則
上面的資料應該規劃成以下的方式
訂單ID商品ID購買數量
121
133
145
2110
2520
291
2103

上面的例子 訂單的ID以及商品ID就是這個購買紀錄的唯一識別碼(主鍵)

文章關鍵字的索引
ID標題關鍵字
1資料庫正規化...資料庫,正規化,php
2php資料結構...php,資料結構

上面的關鍵字欄位就違反了每個欄位只能陳述一個事情

如果關鍵字的數目不會超過3個
或許就會有人改成這樣的方式
ID標題關鍵字1關鍵字2關鍵字3
1資料庫正規化...資料庫正規化php
2php資料結構...php資料結構

但這又違反了不能用多個欄位陳述同一見事實這條規則
關鍵字1,2,3,這三個欄位都是用來陳述關鍵字
所以嘍,這就不是個好的方式,況且每次搜尋得跨欄位

比較適合的方式就會像這樣

文章
ID標題
1資料庫正規化...
2php資料結構...

關鍵字索引
關鍵字文章ID
資料庫1
正規化1
php1
php2
資料結構2

未完....待續

20
Study-Area 公開討論版 / RSS好像有點問題嘍
« 於: 2008-01-16 09:17 »
最近幾天php版的RSS好像出問題了
代碼: [選擇]
Fatal error:  Maximum execution time of 30 seconds exceeded in
/studyarea/www/phorum/Sources/Load.php(195) : runtime-created function
 on line 3
哪位仁兄幫忙看一下是哪邊出了問題吧

21
雜七雜八 / 原來wii的控制器也能玩成這樣
« 於: 2007-12-27 15:07 »
http://www.cs.cmu.edu/~johnny/projects/wii/
這位人兄把wiimote的功能發揮到了極點
真佩服他的創意

22
Study-Area 公開討論版 / 我被禁言嘍
« 於: 2007-11-29 18:03 »
求救阿...
換了SMF之後,我只能在PHP版發言了
連送短訊都不行(沒有檢視帳號的權限)
哪位善心人事可以幫幫忙阿

--------------------------
原來當PHP版的版主就會被關在PHP版裡 :-X

23
symfony安裝完成後
所有的命令列工具都是靠一個symfony這隻程式來完成
我們就以Darkhero兄所舉的範例會員系統作為這個段落的學習目標吧

先初始一個專案吧
假設我們的專案根目錄為 /var/www/member
1.先建立一個目錄
代碼: [選擇]
$mkdir -p /var/www/member
2.切換到專案目錄底下,執行
代碼: [選擇]
$cd /var/www/member
$symfony init-project member

member就是我們專案的名稱嘍
如果沒有意外
symfony會自動幫您建立好您相關的檔案
整個目錄結構就會像這樣
代碼: [選擇]
   apps/
    batch/
    cache/
    config/
    data/
      sql/
    doc/
    lib/
      model/
    log/
    plugins/
    test/
    web/
      css/
      images/
      js

此時記得在apache中的設定檔中加上
代碼: [選擇]
<VirtualHost *:80>
  ServerName member.example.com
  DocumentRoot "/var/www/member/web"
  DirectoryIndex index.php
  <Directory "/var/www/member/web">
   AllowOverride All
  </Directory>
</VirtualHost>

最後記得在/var/www/member/web 建立一個softlink
代碼: [選擇]
ln -sf /usr/lib/php/data/symfony/web/sf sf
如果一切順利
打開瀏覽器,連結到http://member.example.com/ (請依實際狀況,本連結不保證一定work)就可以看到symfony的預設歡迎畫面了

24
PHP程式設計討論區 / Symfony 第0篇--安裝
« 於: 2007-10-23 18:02 »
話說Ruby on Rails興起了一股MVC風潮
php上也冒出了一堆快速開發的工具組
Symfony就是其中的一套
話不多說
我們就從安裝篇開始吧
symfony支援了pear的安裝工具
只要您有安裝 pear
symfony的安裝可是輕鬆又簡單
在linux環境底下
首先切換成root
代碼: [選擇]

#pear channel-discover pear.symfony-project.com
#pear install symfony/symfony

就輕鬆裝完嘍

---------------------------------------
哈混完安裝篇

25
PHP程式設計討論區 / 防止機器人灌水
« 於: 2007-08-21 16:31 »
目前為了避免自動灌水機器人
各個網站的防治方法不外乎使用圖片文字去防堵
不過這種方式除了傷眼睛,對系統而言還得耗費額外的資源去產生動態的圖片
並且紀錄session
相對而言,想要搞破壞的人只要拼命的對你的sever發出request
Server勢必會被這些session以及圖形產生器給搞死
對使用者而言,除了麻煩還是麻煩
那是否有更好的解決方法呢
這幾天上下班的途中突然有了靈感 :D
於是就做出了這個東西

首先我們說明一下原理
目前灌水機器人或是想寫個灌水機器人的"人"
幾乎都是分析HTML的內容去找出特定的input表單
然後在針對這些tag去做post塞資料的動作
所以我們在server端產生一個驗證的字串
透過javascript指定給一個hidden欄位
我們再用這個hidden欄位去做檢查的動作

可是有人會開始質疑,去分析javascript的內容把特定欄位的值抓出來
不就形同破解了
所以為了避免這種情況,我們動用了一個暴力的手法
(當初這種手段是用在病毒上將自己加密來躲過使用特徵碼偵測方式的防毒軟體)
所以嘍,在這裡做了兩個動作

1.將填入驗證值的那段javascript給加密
2.將解密段的程式變數採用不故定長度,而且隨機的名稱,避免被人直接分析文字內容

透過上面這兩個步驟,想單純使用文字分析的方式就破功了
想破解這段,勢必得弄個javascript的直譯器才行
這工程太浩大了,應該沒人這麼閒吧

下一篇就是程式碼實做的部份嘍

待續...

26
雜七雜八 / 棒球日
« 於: 2007-06-13 13:09 »
今天真是台灣棒球日
先是王建民順利拿下個人第6勝
接著郭泓志接力先發
除了轟出個人生涯第1發全壘打
也幫自己順利拿下今年的第1勝
雖然人在上班心還是默默的幫忙加油
看著第8局洋基放肆火的驚險救援
小小郭神來一棒的全壘打
真是高潮迭起的早上阿

27
最近把PHP更新到 5.2.2
發現Web Service居然跑不起來了
仔細檢查的結果,發現PHP 5.2.2沒有把binary格式的POST Data指定給$HTTP_RAW_POST_DATA這個變數

我的環境是CentOS 4.4 以及 mandriva 2007.1

不知有沒有善心人士有裝php 5.2.2的幫忙測試一下吧。
附上測試的程式碼,
測試前記得php.ini要加上always_populate_raw_post_data=On
由於程式是使用socket去做測試,所以php得把socket支援給編進去.

test.php
代碼: [選擇]

<?php
if&#40;isset&#40;$_GET['Test'&#93;&#41;&#41;
 
die&#40;"Raw&#58;$HTTP_RAW_POST_DATA"&#41;;
echo 'Your PHP Version&#58;'.phpversion&#40;&#41;.'<br><br>';
if&#40;!function_exists&#40;'socket_create'&#41;&#41; 
 
die&#40;'Please recompile your PHP with <font color=red>--enable-sockets</font> option!<br>'&#41;;
if&#40;isset&#40;$_POST['runtest'&#93;&#41;&#41;
&#123;
 
$TestString='This_is_raw_post_data!';
 
$SocketBuffer="POST ".$_SERVER['REQUEST_URI'&#93;."?Test=1 HTTP/1.1\n";
 
$SocketBuffer.="Host&#58; ".$_SERVER['SERVER_NAME'&#93;."\n";
 
$SocketBuffer.="User-Agent&#58; PHP Run Test\n";
 
$SocketBuffer.="Content-Length&#58; ".strlen&#40;$TestString&#41;."\n";
 
$SocketBuffer.="Content-Type&#58; application/octet-stream\n\n$TestString\n";
 
$HttpSock=socket_create&#40;AF_INET, SOCK_STREAM, SOL_TCP&#41;;
 
if&#40;!socket_connect&#40;$HttpSock,"127.0.0.1", 80&#41;&#41; die&#40;"Cannot Run test!"&#41;;
 
if&#40;!socket_write&#40;$HttpSock,$SocketBuffer&#41;&#41; die&#40;"Cannot Run test!"&#41;;
 
$RecvBuffer=socket_read&#40;$HttpSock,4096&#41;;
 
socket_close&#40;$HttpSock&#41;;
 
$RawPOSTData=substr&#40;strstr&#40;$RecvBuffer,'Raw&#58;'&#41;,4&#41;;
 
if&#40;$RawPOSTData!=$TestString&#41; 
  
echo "<font color=red>Found PHP 5.2.2 HTTP_RAW_POST_DATA Bug!</font><br>";
 else
  echo 
"<font color=blue>PASS</font> HTTP_RAW_POST_DATA -> [<font color=red>$TestString</font>&#93;<br>";
&
#125;
?>

<form action='' method=POST>
 <input type=hidden name=runtest value='runtest'>
 <input type=submit name=submit value="Run Test">
</form>

28
最近剛好遇到一個頭大的問題寫了這個code讓大家參考一下吧
家裏的無線AP功能不太好,他只提供把外部真實IP map 到 Nat裡面的某個IP
不能指定某個port map到某個內部IP的Port
可是我已經把外部的IP Map到內部的Linux Server上,
但是我又想從外部使用VNC連到內部的一台Windows電腦。
所以就寫了這個程式
原理是這樣

這個程式會在Linux Server上開一個Port作Listen的動作
當外部連到這個Port時,程式會再開啟另一個連線連到內部Windows的VNC上
把外部的封包原封不動的丟到VNC的連線上,然後把VNC連線傳回的資料原封不動的再丟回外部的Port

代碼: [選擇]

#!/usr/bin/php -q
<?php
 $IP
='192.168.1.1'//Windows電腦的IP
 
$Port='5900';        //VNC使用的Port
 
$ServerPort='9999'//Linux Server對外使用的Port
 
$RemoteSocket=false//連線到VNC的Socket
 
function SignalFunction&#40;$Signal&#41; 
 
&#123;
   //這是主Process的訊息處理函數
  
global $PID//Child Process的PID
  
switch &#40;$Signal&#41; 
  
&#123;
   
case SIGTRAP&#58;
   
case SIGTERM&#58;
    //收到結束程式的Signal
    
if&#40;$PID&#41; 
    
&#123;
     //送一個SIGTERM的訊號給Child告訴他趕快結束掉嘍
     
posix_kill&#40;$PID,SIGTERM&#41;;
     //等待Child Process結束,避免zombie
     
pcntl_wait&#40;$Status&#41;;
    
&#125;
    //關閉主Process開啟的Socket
    
DestroySocket&#40;&#41;;
    
exit&#40;0&#41;; //結束主Process
    
break;
   case 
SIGCHLD&#58;
    /*
當Child Process結束掉時,Child會送一個SIGCHLD訊號給Parrent
當Parrent收到SIGCHLD,就知道Child Process已經結束嘍 ,該做一些
結束的動作*/
    
unset&#40;$PID&#41;; //將$PID清空,表示Child Process已經結束
    
pcntl_wait&#40;$Status&#41;; //避免Zombie
    
break;
   default&
#58;
  
&#125;
 
&#125;
 
function ChildSignalFunction&#40;$Signal&#41;
 
&#123;
//這是Child Process的訊息處理函數
  
switch &#40;$Signal&#41; 
  
&#123;
   
case SIGTRAP&#58;
   
case SIGTERM&#58;
//Child Process收到結束的訊息
    
DestroySocket&#40;&#41;; //關閉Socket
    
exit&#40;0&#41;; //結束Child Process
   
default&#58;
  
&#125;
 
&#125;
 
function ProcessSocket&#40;$ConnectedServerSocket&#41;
 
&#123;
  //Child Process Socket處理函數
  //$ConnectedServerSocket -> 外部連進來的Socket
  
global $ServerSocket,$RemoteSocket,$IP,$Port;
  
$ServerSocket=$ConnectedServerSocket;
  declare&
#40;ticks = 1&#41;; //這一行一定要加,不然沒辦法設定訊息處理函數。
//設定訊息處理函數
  
if&#40;!pcntl_signal&#40;SIGTERM, "ChildSignalFunction"&#41;&#41; return;
  
if&#40;!pcntl_signal&#40;SIGTRAP, "ChildSignalFunction"&#41;&#41; return;
//建立一個連線到VNC的Socket
  
$RemoteSocket=socket_create&#40;AF_INET, SOCK_STREAM,SOL_TCP&#41;;
//連線到內部的VNC
  
@$RemoteConnected=socket_connect&#40;$RemoteSocket,$IP,$Port&#41;;
  
if&#40;!$RemoteConnected&#41; return; //無法連線到VNC 結束
//將Socket的處理設為Nonblock,避免程式被Block住
  
if&#40;!socket_set_nonblock&#40;$RemoteSocket&#41;&#41; return;
  
if&#40;!socket_set_nonblock&#40;$ServerSocket&#41;&#41; return;
  
while&#40;true&#41;
  
&#123;
//這邊我們採用pooling的方式去取得資料
   
$NoRecvData=false;   //這個變數用來判別外部的連線是否有讀到資料
   
$NoRemoteRecvData=false//這個變數用來判別VNC連線是否有讀到資料
   
@$RecvData=socket_read&#40;$ServerSocket,4096,PHP_BINARY_READ&#41;;
//從外部連線讀取4096 bytes的資料
   
@$RemoteRecvData=socket_read&#40;$RemoteSocket,4096,PHP_BINARY_READ&#41;;
//從vnc連線連線讀取4096 bytes的資料
   
if&#40;$RemoteRecvData===''&#41;
   
&#123;
//VNC連線中斷,該結束嘍
    
echo "Remote Connection Close\n";
    return;   
   &
#125;
   
if&#40;$RemoteRecvData===false&#41;
   
&#123;
/*
由於我們是採用nonblobk模式
這裡的情況就是vnc連線沒有可供讀取的資料
*/
    
$NoRemoteRecvData=true;
//清除掉Last Errror
    
socket_clear_error&#40;$RemoteSocket&#41;;
   
&#125;
   
if&#40;$RecvData===''&#41;
   
&#123;
//外部連線中斷,該結束嘍
    
echo "Client Connection Close\n";
    return;
   &
#125;
   
if&#40;$RecvData===false&#41;
   
&#123;
/*
由於我們是採用nonblobk模式
這裡的情況就是外部連線沒有可供讀取的資料
*/
    
$NoRecvData=true;
//清除掉Last Errror
    
socket_clear_error&#40;$ServerSocket&#41;;
   
&#125;
   
if&#40;$NoRecvData&&$NoRemoteRecvData&#41;
   
&#123;
//如果外部連線以及VNC連線都沒有資料可以讀取時,
//就讓程式睡個0.1秒,避免長期佔用CPU資源
    
usleep&#40;100000&#41;;
//睡醒後,繼續作pooling的動作讀取socket
    
continue;
   &
#125;
   //Recv Data
   
if&#40;!$NoRecvData&#41;
   
&#123;
//外部連線讀取到資料
    
while&#40;true&#41;
    
&#123;
//把外部連線讀到的資料,轉送到VNC連線上
     
@$WriteLen=socket_write&#40;$RemoteSocket,$RecvData&#41;;
     
if&#40;$WriteLen===false&#41;
     
&#123;
//由於網路傳輸的問題,目前暫時無法寫入資料
//先睡個0.1秒再繼續嘗試。
      
usleep&#40;100000&#41;;
      
continue;
     &
#125;
     
if&#40;$WriteLen===0&#41;
     
&#123;
//遠端連線中斷,程式該結束了
      
echo "Remote Write Connection Close\n";
      return;
     &
#125;
//從外部連線讀取的資料,已經完全送給VNC連線時,中斷這個迴圈。
     
if&#40;$WriteLen==strlen&#40;$RecvData&#41;&#41; break;
//如果資料一次送不完就得拆成好幾次傳送,直到所有的資料全部送出為止
     
$RecvData=substr&#40;$RecvData,$WriteLen&#41;;
    
&#125;
   
&#125;
   
if&#40;!$NoRemoteRecvData&#41;
   
&#123;
//這邊是從VNC連線讀取到的資料,再轉送回外部的連線
//原理跟上面差不多不再贅述
    
while&#40;true&#41;
    
&#123;
     
@$WriteLen=socket_write&#40;$ServerSocket,$RemoteRecvData&#41;;
     
if&#40;$WriteLen===false&#41;
     
&#123;
      
usleep&#40;100000&#41;;
      
continue;
     &
#125;
     
if&#40;$WriteLen===0&#41;
     
&#123;
      
echo "Remote Write Connection Close\n";
      return;
     &
#125;
     
if&#40;$WriteLen==strlen&#40;$RemoteRecvData&#41;&#41; break;
     
$RemoteRecvData=substr&#40;$RemoteRecvData,$WriteLen&#41;;
    
&#125;
   
&#125;
  
&#125;
 
&#125;
 
function DestroySocket&#40;&#41;
 
&#123;
//用來關閉已經開啟的Socket
  
global $ServerSocket,$RemoteSocket;
  if&
#40;$RemoteSocket&#41;
  
&#123;
//如果已經開啟VNC連線
//在Close Socket前必須將Socket shutdown不然對方不知到你已經關閉連線了
   
@socket_shutdown&#40;$RemoteSocket,2&#41;;
   
socket_clear_error&#40;$RemoteSocket&#41;;
//關閉Socket
   
socket_close&#40;$RemoteSocket&#41;;   
  
&#125;
//關閉外部的連線
  
@socket_shutdown&#40;$ServerSocket,2&#41;;
  
socket_clear_error&#40;$ServerSocket&#41;;
  
socket_close&#40;$ServerSocket&#41;;
 
&#125;
//這裡是整個程式的開頭,程式從這邊開始執行
//這裡首先執行一次fork
 
$PID pcntl_fork&#40;&#41;;
 
if&#40;$PID==-1&#41; die&#40;"could not fork"&#41;;
//如果$PID不為0表示這是Parrent Process
//$PID就是Child Process
//這是Parrent Process 自己結束掉,讓Child成為一個Daemon。
 
if&#40;$PID&#41; die&#40;"Daemon PID&#58;$PID\n"&#41;; 
//從這邊開始,就是Daemon模式在執行了
//將目前的Process跟終端機脫離成為daemon模式
 
if&#40;!posix_setsid&#40;&#41;&#41; die&#40;"could not detach from terminal\n"&#41;;
//設定daemon 的訊息處理函數
 
declare&#40;ticks = 1&#41;;
 
if&#40;!pcntl_signal&#40;SIGTERM, "SignalFunction"&#41;&#41; die&#40;"Error!!!\n"&#41;;
 
if&#40;!pcntl_signal&#40;SIGTRAP, "SignalFunction"&#41;&#41; die&#40;"Error!!!\n"&#41;;
 
if&#40;!pcntl_signal&#40;SIGCHLD, "SignalFunction"&#41;&#41; die&#40;"Error!!!\n"&#41;;
//建立外部連線的Socket
 
$ServerSocket socket_create&#40;AF_INET, SOCK_STREAM,SOL_TCP&#41;;
//設定外部連線監聽的IP以及Port,IP欄位設0,表示經聽所有介面的IP
 
if&#40;!socket_bind&#40;$ServerSocket,0,$ServerPort&#41;&#41; die&#40;"Cannot Bind Socket!\n"&#41;;
//開始監聽Port
 
if&#40;!socket_listen&#40;$ServerSocket&#41;&#41; die&#40;"Cannot Listen!\n"&#41;;
//將Socket設為nonblock模式
 
if&#40;!socket_set_nonblock&#40;$ServerSocket&#41;&#41; die&#40;"Cannot Set Server Socket to Block!\n"&#41;;
//清空$PID變數,表示目前沒有任何的Child Process
 
unset&#40;$PID&#41;;
 
while&#40;true&#41;
 
&#123;
//進入pooling模式,每隔1秒鐘就去檢查有沒有連線進來。
  
sleep&#40;1&#41;;
//檢查有沒有連線進來
  
@$ConnectedServerSocket=socket_accept&#40;$ServerSocket&#41;;
  
if&#40;$ConnectedServerSocket!==false&#41;
  
&#123;
//有人連進來嘍
//起始一個Child Process用來處理連線
   
$PID pcntl_fork&#40;&#41;;
   
if&#40;$PID==-1&#41; die&#40;"could not fork"&#41;;
   
if&#40;$PID&#41; continue;//這是daemon process,繼續回去監聽。
   //這裡是Child Process開始
   //執行Socket裡函數
   
ProcessSocket&#40;$ConnectedServerSocket&#41;;
  //處理完Socket後,結束掉Socket
   
DestroySocket&#40;&#41;;
  //結束Child Process
   
exit&#40;0&#41;;
  
&#125;
 
&#125;
?>


29
資料庫運行一段時間之後
因為常常進行新增,刪除的動作
導致Index留下大量的垃圾資料
使得Index存取效率不佳
這時候就得進行vacuum來清理資料庫
在PostgreSQL底下可以執行vacuum -f
來進行完整的資料重整
讓資料庫維持在最佳狀況
然而進行vacuum時相對的也會影響到存取的效能
那何時才是進行vacuum最佳時機呢
這個問題在PostgreSQL 8.0開始有了一個好的解決辦法

PostgreSQL 8.0開始將Auto Vacuum整合到核心中
系統會進行自我監視
當資料庫效能下降需要進行vacuum動作來提昇效能時
他會啟動vacuum讓自己達到最佳化的動作

只要把postgresql.conf中
autovacuum選項設為on
如下
autovacuum = on

重新啟動PostgreSql
他就會自己進行最佳化的維護了

30
備份對於資料庫來說可是一件相當重要的事
在PostgreSQL上也不例外

在MySQL上許多User 習慣將DB Shutdown再把DB存放目錄整個copy下來
MySQL或許OK
可是到了PostgreSQL上這樣可是會有大麻煩的
在同一版本之間備份或許還Ok
一旦版本有變動那可是會造成資料錯誤的
況且對於資料庫系統來說備份時要shutdown Server尤其是流量頻繁的商用環境那可是很糟糕的設計

因此PostgreSQL在設計的時候就考慮到了這點
他提供了hot backup在不停止資料庫的情況下進行資料備份
由於PostgreSQL本身使用了MVCC(MultiVersion Concurrency Control)機制
在資料備份的過程中會先建立一份資料快照
避免備份過程因為其他寫入動作造成資料備份有問題

說了這麼多
該如何備份資料庫呢
在PostgreSQL備份還原只用到了兩個工具 pg_dump 以及 psql

備份單一資料庫
代碼: [選擇]
pg_dump -c [DB名稱] > xxx.sql

或是一次備份所有資料庫的資料
代碼: [選擇]
pg_dumpall -c > xxx.sql

還原資料庫的步驟也很簡單
只有三個步驟可
1.刪除掉舊的資料庫
2.建立一個空資料庫
3.將資料倒回

例如我們要還原test這個database
在命令列中使用
代碼: [選擇]

1.dropdb test;
2.createdb test;
3.psql test < xxx.sql

這樣就輕鬆將資料庫給還原了
若是您對diff,patch很熟的話
還可以搭配diff,patch工具進行差異備份節省空間

PostgreSQL進行版本升級時得注意
當主版本版次變更時必須使用backup , Restore
不能只有升級主程式
何謂主版本版次變更?

例如
7.4.x -> 8.1.x 或是8.1.x -> 8.2.x
都必須進行backup restore

如果是8.1.1 -> 8.1.2
這樣是不需要進行backup,restore動作
只需更新主程式就行了

頁: [1] 2