現(xiàn)在,PHP與Oracle連接一般用到php_oci8.dll。
但是,寫完P(guān)HP代碼調(diào)試的時(shí)候,我遇到了一個(gè)很古怪的問題,就是只有每一次開機(jī)第一次連能成功拿到數(shù)據(jù),后來怎么試都不行,直接給出了錯(cuò)誤信息Warning: ociexecute() [function.ociexecute]: OCIStmtExecute: ORA-24324: service handle not initialized。當(dāng)時(shí)的PHP代碼如下(這段代碼從Oracle獲得數(shù)據(jù)生成了一個(gè)表單):
-
$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>進(jìn)入公司日期</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);
通過查閱資料,在一個(gè)英文論壇不起眼的地方發(fā)現(xiàn)有人說,這是PHP5的bug,用oci_new_connect代替OCILogon函數(shù)就可以解決問題。
當(dāng)時(shí)就這么解決了,也沒管。
當(dāng)我做完東西,apache都拆了的時(shí)候,發(fā)現(xiàn)有些PHP網(wǎng)頁里,我在使用完數(shù)據(jù)庫之后漏寫了OCILogoff,也就是沒有釋放連接。我猜這就是癥結(jié)所在,因?yàn)樗械倪@些PHP都是用同一個(gè)賬戶連接的,產(chǎn)生了沖突,而oci_new_connect新建連接顯然可以避免這個(gè)問題。
所以,我想,如果所有的網(wǎng)頁都在使用完連接之后安全釋放,應(yīng)該就能夠避免上面的問題。不過,也沒機(jī)會進(jìn)行驗(yàn)證了,如果有同志遇到這樣的問題,不妨試一下。 本文出自:億恩科技【mszdt.com】
服務(wù)器租用/服務(wù)器托管中國五強(qiáng)!虛擬主機(jī)域名注冊頂級提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]
|