我在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;
}
}
DBW
和DBL
是前面几行定义的常量。
我得到的错误:
无法找到驱动程序
"为什么这很奇怪?"。你问。 "因为问题不一致。",我回答。让我详细说明......
当有人访问网站时发生的第一个操作是登录,需要读取和写入数据库。 这样可以正常使用(正如应用程序在任何'普通'服务器上所做的那样)。
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使用 -
我是否将AWS实例配置错误了?
答案 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