PHP连接Oracle错误ORA-24324服务句柄未初始化的解决方法


     现在,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) : "&nbsp;") . "</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新建连接显然可以避免这个问题。

       所以,我想,如果所有的网页都在使用完连接之后安全释放,应该就能够避免上面的问题。不过,也没机会进行验证了,如果有同志遇到这样的问题,不妨试一下。

相关内容