PDO 3,多次运行:错误:17数据库架构已更改 - php

我有这个测试代码:

session_start();
session_write_close();
set_time_limit(0);

for ($i = 1; $i < 1000; $i++)
{
    if (rand(1,5) == 1)
    {
        $file_db = new PDO('sqlite:x.db');
        $file_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $file_db->exec('DROP TABLE IF EXISTS messages');
        $file_db = null;
    }
    $file_db = new PDO('sqlite:x.db');
    $file_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $file_db->exec('CREATE TABLE IF NOT EXISTS messages (id INTEGER PRIMARY KEY AUTOINCREMENT,title TEXT,message TEXT,time INTEGER)');
    $file_db->query('INSERT INTO messages VALUES (null, "'.rand(1,9999).'", "'.rand(1,99).'", date("now"))');
    $file_db = null;
}

$file_db = new PDO('sqlite:x.db');
$file_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$i = 0;
foreach ($file_db->query('SELECT * FROM messages') as $m)
{
    $i++;
    echo $i.' -> '.$m['id'].'<br>';
}

使用此代码Im测试PDO 3是否可以使用多个并发。如果此代码在一个线程中运行,则一切正常。但是,一旦我启动了这两个实例,就会收到以下消息:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 17 database schema has changed' in code.php:* Stack trace: #0 code.php(*): PDO->query('INSERT INTO mes...') #1 {main} thrown in code.php on line *

错误行是INSERT INTO所在的位置。为什么会发生这种情况,以及如何避免这种情况发生? (我正在创建一个缓存系统,很可能会创建和删除表。我知道有TRUNCATE,我只是想知道为什么会这样)

参考方案

[...]一旦我启动了这两个实例,就会收到以下消息:[...] SQLSTATE [HY000]:一般错误:17数据库架构已更改[...]为什么会发生以及如何发生闪避吗?

Sqlite是单个文件数据库。并行打开它,然后更改数据库结构。刚将表插入要插入时插入数据的操作不起作用,因为表已消失。这解释了为什么会发生。

就像您现在希望已经理解的那样,不可能插入到不存在的表中,该解决方案可能清晰可见:仅插入现有表中。

为确保在删除表后创建表,在事务中执行以下操作可能会有所帮助:https://www.sqlite.org/lang_transaction.html

PDO PHP SQLite3数据库连接常规错误14 - php

我有2个sqlite3.x数据库(来自iPhone),一个来自游戏应用程序,另一个是通讯录。我在php conf中记录日志并显示错误“ on”。使用PHP / PDO,我可以显示游戏数据库中的字段和值,包括我在结果页中捕获的图像斑点,并使用“ img src ='data:...”进行渲染。我在其他字段上使用htmlentities捕获plist二进制blo…

PHP-全局变量的性能和内存问题 - php

假设情况:我在php中运行一个复杂的站点,并且我使用了很多全局变量。我可以将变量存储在现有的全局范围内,例如$_REQUEST['userInfo'],$_REQUEST['foo']和$_REQUEST['bar']等,然后将许多不同的内容放入请求范围内(这将是适当的用法,因为这些数据指的是要求自…

PHP strtotime困境 - php

有人可以解释为什么这在我的服务器上输出为true吗?date_default_timezone_set('Europe/Bucharest'); var_dump( strtotime('29.03.2015 03:00', time()) === strtotime('29.03.2015 04:00�…

php-casperjs获取内部文本 - php

我正在为casperjs使用php包装器-https://github.com/alwex/php-casperjs我正在网上自动化一些重复的工作,我需要访问一个项目的innerText,但是我尚不清楚如何从casperjs浏览器访问dom。我认为在js中我会var arr = document.querySelector('label.input…

php:拆分字符串,直到第一次出现数字 - php

我有像cream 100G sup 5mg Children 我想在第一次出现数字之前将其拆分。所以结果应该是array( array('cream','100G'), array('sup','5mg Children') ); 可以告诉我如何为此创建图案吗?我试过了list(…