3

我有一个 PHP 脚本,它按所示顺序执行以下操作:

  • 连接到 MySQL 数据库
  • 检索单行数据
  • 关闭 MySQL 数据库连接
  • 连接到本地文件系统上的 SQLite 数据库
  • 将数据行插入 SQLite 数据库
  • 关闭 SQLite 数据库连接

我使用 PDO 作为 MySQL 和 SQLite 的工具。这是插入的代码:

$sqlite = new PDO('sqlite:activity.sqlite');
$sqlite->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

$lite = <<<LITE
INSERT INTO Transactions (Date,Transactions,ActiveMembers,Amount) 
VALUES
('$day',
'$trans',
'$active',
'$amount');
LITE;

try
{
    $sqlite->exec($lite);
}
catch (PDOException $e)
{
    die($e->getMessage());
}

(请原谅在查询中使用变量,而不是适当的准备语句;我删除了绑定参数以查看是否是问题所在)

使用其他工具(Firefox 的 SQLite 管理器,Windows 的 SQLite 数据库浏览器),我能够访问数据库并写入它。

这个脚本是唯一触及这个特定数据库的东西。数据库文件的权限是777. 当脚本运行时,没有其他任何东西会打开它或其包含的目录。

运行脚本时(使用php -f),尝试插入 SQLite 数据库的部分会创建日志文件,大约需要 10-15 秒,然后返回错误SQLSTATE[HY000]: General error: 5 database is locked

那么,我的问题是:

从命令行运行 PHP 脚本是否会阻止与 SQLite 数据库的交互?如果是这样,是什么?如果不是,这里可能是什么问题?

4

2 回答 2

1

请务必清除与 SQLite 的连接,即在您的代码之后,设置

$sqlite = null;

http://php.net/manual/en/pdo.connections.php

于 2012-10-23T14:37:32.933 回答
1

我遇到了同样的问题。在使用fuser命令并找到哪个进程创建了粘滞锁后,我知道了流氓:

[root]# fuser cms.db
cms.db:               4511
[root]# ps aux | grep 4511
nobody    4511  0.0  3.2  74560 25160 ?   S    Oct13   2:00 php-fpm
[root]# /etc/init.d/php-fpm restart

PHP-fpm是有罪的,所以重新启动服务就可以了。那一定是我正在运行的 PHP 版本(5.4)中的一个错误,并且可能仍然存在。

于 2013-11-24T14:13:40.530 回答