我意识到对这个问题的下意识反应是"你不要.",但是听我说.
基本上我在SQL上的活动记录系统上运行,并且为了防止同一数据库行的重复对象,我在工厂中为每个当前加载的对象保留一个"数组"(使用自动增量'id'作为键).
问题是,当我尝试在奇怪的场合通过这个系统处理90,000多行时,PHP会遇到内存问题.这很容易通过每隔几百行运行一次垃圾收集来解决,但不幸的是,由于工厂存储了每个对象的副本 - PHP的垃圾收集不会释放任何这些节点.
我能想到的唯一解决方案是检查存储在工厂中的对象的引用计数是否等于1(即没有引用该类),如果是这样,则释放它们.这可以解决我的问题,但PHP没有引用计数方法?(除了debug_zval_dump,但那几乎不可用).
我使用 sqlite 在 php 中开发一个 web 应用程序,将数据存储在数据库中。正如在互联网上看到的,我使用 PDO 而不是 SQLITE3 类。我执行了互联网上显示的所有步骤来避免此错误消息,但它仍然出现:
SQLSTATE[HY000] [14] 无法打开数据库文件
周期性任务每 30 秒运行一次,以获取表中的条目数。该任务由 Javascript/Jquery 触发。在普通的 php 文件上,使用 PDO 没有任何问题。但是将它与 Javascript/Jquery 结合使用时我收到了上面的消息。
我已经将整个路径和数据库设置为网络服务器的用户/组并设置为 chmod 0777。
我自己编写的数据库类被创建并存储在会话变量中,以避免在网页生命周期中创建和销毁。
该函数连接到数据库(该函数和下一个函数位于同一类中):
private $db = null;
private function connectdb(){
try {
$this->db = new PDO(database,"","",array(
PDO::ATTR_PERSISTENT => TRUE,
PDO::ERRMODE_EXCEPTION => TRUE));
} catch (PDOException $e) {
logerror($e->getMessage(), "connecthrsedb");
return exception;
}
}
Run Code Online (Sandbox Code Playgroud)
该函数正在执行查询:
function getNumberofEntriesinTable() {
try {
if (is_null($this->db)) {
if ($this->connectdb() < 0) {
return -1;
}
}
$statement = …Run Code Online (Sandbox Code Playgroud)