我正在使用PHP,Oracle和crontab。 Crontab正在调用一个php脚本,它将在本地和远程数据库之间同步一些数据。
首先,我考虑将所有这些放在一个大的,匿名的内联PL / SQL块中并在PHP中执行。问题是,如果没有创建一个表来审计程序,它对我的PHP代码来说真的是不透明的,直到它返回。然后当它返回时,我能做的最好的事情是在out参数中接收一个字符串,我将它作为审计日志连接在一起。
然后我考虑将其分解为几个SQL语句,并让PHP对它们之间的数据进行一些中间审计/记录和操作。
我对这些中的任何一个都不满意。如何组织在cronjob中调用的维护代码?
答案 0 :(得分:1)
我假设您对此类脚本使用手动提交模式。我使用的大多数维护脚本只是用非常小的请求来完成工作(不是更小更好,但更小更简单)并在出现问题时抛出异常,如果异常不可恢复,那么我回滚修改和使用error_log()
和关键任务mail()
输出问题。如果一切正常,根本没有输出,则只需提交更改。如果我需要旗帜或其他内容,我可以使用apc_store
/ apc_fetch()
或简单文件。
答案 1 :(得分:1)
使用Oracle时,通常使用Oracle的调度程序(或9i之前的作业)在数据库中完成此类操作。但是,即使您使用它,该过程在运行时也会对PHP代码不透明。
听起来你真正想要的是PHP代码能够知道大型匿名块在运行时的进展情况。在不写表的情况下处理该问题的最佳方法是使用上下文。基本上,您将在数据库中创建全局上下文,然后向匿名块添加行以在进程中更新上下文。由于全局上下文在所有会话中都是可见的,因此您可以运行单独的PHP线程来监视上下文并将更改写入日志。
但是,在创建上下文时,必须指明允许哪个包管理它,因此您无法直接从自治块更新它。您可以通过将整个自治块移动到一个包中,或者通过创建一个除了更新上下文之外什么都不做的小包,然后从块中调用该过程来完成此任务。
答案 2 :(得分:0)
如果本地数据库和远程数据库都是Oracle,那么您可能需要将Oracle Replication视为PHP脚本的更具弹性的替代方案