SQLite3无法在Amazon AWS上写入数据库文件,但仅在某些情况下

时间:2015-06-04 16:33:37

标签: php amazon-ec2 sqlite ubuntu-14.04

我在AWS上有设置和EC2实例,作为此实例的一部分,我使用SQLite3数据库来处理某些数据。所有数据库操作都通过单个PHP文件路由,只需一个连接:

function dataQuery($query)
{
    // establish database connection
    try
    {
        $dbh = new PDO(DBW); // try windows first
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    catch(PDOException $e)
    {
        echo $e->getMessage();
        $errorCode = $e->getCode();

        // windows not available, try linux
        if('14' == $errorCode)
        {
            try
            {
                $dbh = new PDO(DBL); // try linux
                $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            }
            catch(PDOException $e)
            {
                echo $e->getMessage();
                $errorCode = $e->getCode();
            }
        }
    }

    // try to run query
    try
    {
        $queryResults = $dbh->query($query);
        if($queryResults != null)
        {
            $results = $queryResults->fetchAll(PDO::FETCH_OBJ); // always return an object
            $queryResults = NULL; // closes the connection
            return $results;
        }
    }
    catch(PDOException $e)
    {
        $errorMsg = $e->getMessage();
        return $errorMsg;
    }
}

DBWDBL是前面几行定义的常量。 我得到的错误:

  

无法找到驱动程序

"为什么这很奇怪?"。你问。 "因为问题不一致。",我回答。让我详细说明......

当有人访问网站时发生的第一个操作是登录,需要读取和写入数据库。 这样可以正常使用(正如应用程序在任何'普通'服务器上所做的那样)。

2|Jay Blanchard|jayblanchard@thewebsite.com|foo|{"roles":["admin", "surveyor"]}|2015-06-04 15:32:29|69.1.164.40

还有其他几个地方总是会发生阅读,而写作则不会。有时写作有效。

我已经关注了十几个链接,几乎都说文件权限是错误的。我仔细地跟踪了这个工作的服务器上的文件权限实例,并忠实地复制了它们:

drwxrwxrwx 10 ubuntu ubuntu 4096 Jun  4 15:32 application-gateway

在该目录中的数据库文件本身:

-rwxrw-rw-  1 ubuntu ubuntu  65536 Jun  4 15:32 application.db

尝试访问数据库的所有文件都以ubuntu作为组和所有者。

我已按照其他链接确保PDO扩展程序已正确包含在/etc/php5/apache2/conf.d/

lrwxrwxrwx 1 root root   32 Jun  3 15:29 05-opcache.ini -> ../../mods-available/opcache.ini
lrwxrwxrwx 1 root root   28 Jun  3 15:29 10-pdo.ini -> ../../mods-available/pdo.ini
lrwxrwxrwx 1 root root   29 Jun  3 15:29 20-json.ini -> ../../mods-available/json.ini
lrwxrwxrwx 1 root root   31 Jun  3 15:33 20-mysqli.ini -> ../../mods-available/mysqli.ini
lrwxrwxrwx 1 root root   30 Jun  3 15:33 20-mysql.ini -> ../../mods-available/mysql.ini
lrwxrwxrwx 1 root root   34 Jun  3 15:33 20-pdo_mysql.ini -> ../../mods-available/pdo_mysql.ini
lrwxrwxrwx 1 root root   33 Jun  3 15:29 20-readline.ini -> ../../mods-available/readline.ini
lrwxrwxrwx 1 root root   35 Jun  3 20:17 pdo_sqlite.ini -> ../../mods-available/pdo_sqlite.ini

我不确定我在这里缺少什么。司机显然在那里并且可以阅读。在写期间,驱动程序不会更改位置,并且会发生一些写入

确认PDO驱动程序可供PHP使用 -

PHP Info 我是否将AWS实例配置错误了?

1 个答案:

答案 0 :(得分:2)

经过几个小时的阅读和k and以及挠头之后,我终于找到了造成这个问题的原因。

应用程序根据所采取的操作,对数据库使用Web和命令行调用的混合。这些包括全职服务,CRON作业和来自Web服务器之外的其他脚本的PHP脚本。我能够跟踪问题,直到PHP的Web和PHP CLI之间的差异。

虽然所有这些服务都使用上面显示的脚本来连接数据库并运行查询,但驱动程序的位置取决于请求的来源。如果请求来自命令行调用,则包含的文件(上面)将所有内容视为应该从命令行获得资源。

SQLite3的驱动程序需要包含在PHP CLI的配置文件中。一旦在PHP CLI中正确引用了SQLite驱动程序,一切都开始按设计工作。

ubuntu@foo:/etc/php5/cli/conf.d$ ls -la
total 8
drwxr-xr-x 2 root root 4096 Jun  4 19:16 .
drwxr-xr-x 3 root root 4096 Jun  3 15:29 ..
lrwxrwxrwx 1 root root   32 Jun  3 15:29 05-opcache.ini -> ../../mods-available/opcache.ini
lrwxrwxrwx 1 root root   28 Jun  3 15:29 10-pdo.ini -> ../../mods-available/pdo.ini
lrwxrwxrwx 1 root root   29 Jun  3 15:29 20-json.ini -> ../../mods-available/json.ini
lrwxrwxrwx 1 root root   31 Jun  3 15:33 20-mysqli.ini -> ../../mods-available/mysqli.ini
lrwxrwxrwx 1 root root   30 Jun  3 15:33 20-mysql.ini -> ../../mods-available/mysql.ini
lrwxrwxrwx 1 root root   34 Jun  3 15:33 20-pdo_mysql.ini -> ../../mods-available/pdo_mysql.ini
lrwxrwxrwx 1 root root   35 Jun  4 19:15 20-pdo_sqlite.ini -> ../../mods-available/pdo_sqlite.ini
lrwxrwxrwx 1 root root   33 Jun  3 15:29 20-readline.ini -> ../../mods-available/readline.ini
lrwxrwxrwx 1 root root   32 Jun  4 19:16 20-sqlite3.ini -> ../../mods-available/sqlite3.ini