現在,PHP與Oracle串連一般用到php_oci8.dll。
但是,寫完PHP代碼調試的時候,我遇到了一個很古怪的問題,就是只有每一次開機第一次連能成功拿到資料,後來怎麼試都不行,直接給出了錯誤資訊Warning: ociexecute() [function.ociexecute]: OCIStmtExecute: ORA-24324: service handle not initialized。當時的PHP代碼如下(這段代碼從Oracle獲得資料產生了一個表單):
$oraUser="VISITOR";
$oraPass="123456";
$oraDB="company";
$conn = OCILogon ($oraUser,$oraPass,$oraDB);
if (!$conn) {
exit;
}
$stmt = OCIParse($conn,"select * from visitor.employee");
if(!$stmt) {
exit;
}
OciExecute($stmt);
echo "<table width=75% border='1' cellspacing='0' cellpadding='1'>\n";
echo "<br/><tr>\n<td>名字</td><td>性別</td><td>員工編號</td><td>工資</td><td>部門</td><td>出生日期</td><td>進入公司日期</td>\n</tr>\n";
while ($row = oci_fetch_array($stmt, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo "<tr>\n";
foreach ($row as $item) {
echo "<td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : " ") . "</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";
OCIFreeStatement($stmt);
OCILogoff($conn);
通過查閱資料,在一個英文論壇不起眼的地方發現有人說,這是PHP5的bug,用oci_new_connect代替OCILogon函數就可以解決問題。
當時就這麼解決了,也沒管。
當我做完東西,apache都拆了的時候,發現有些PHP網頁裡,我在使用完資料庫之後漏寫了OCILogoff,也就是沒有釋放串連。我猜這就是癥結所在,因為所有的這些PHP都是用同一個賬戶串連的,產生了衝突,而oci_new_connect建立串連顯然可以避免這個問題。
所以,我想,如果所有的網頁都在使用完串連之後安全釋放,應該就能夠避免上面的問題。不過,也沒機會進行驗證了,如果有同志遇到這樣的問題,不妨試一下。