我似乎已经发现了问题所在。如果我在通过普通SQL查询获取数据之前执行commit
和begin
,那么它就可以工作。.
但是为什么呢?升级之前不需要这样做。.PHP(或PDO)发生了什么变化?
我有一个测试,可以测试应用程序中的所有功能
它如何工作。
首先,我(对本地主机)执行curl
,以通过应用程序API插入一些数据。
立即(在同一脚本中)检查数据库中的数据(仅通过执行简单的SQL查询即可)。
但是数据不可见?如果我将SQL复制/粘贴到phpmyadmin,则获取新记录
已从PHP7.0
升级到PHP7.3
,我使用PDO(mysqli)
// run an insert method to the application API
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_ENCODING, '');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
$output = curl_exec($ch);
curl_close($ch);
// immediately after (in the same script) fetching the data from the database with plain SQL query (empty result)
\DB::commit(); // <-- this commit
\DB::begin(); // <-- and this begin solves it
$dbh = \DB::get_dbh();
$sql = 'SELECT id FROM block WHERE id='.$output['id'];
$sth = $dbh->prepare($sql);
$sth->execute();
$res = $sth->fetch();
echo "sql: $sql\n";
var_dump($res);
// if I copy/paste the same SQL query to phpmyadmin the record is found (or run it from a new script)
我认为这有点奇怪。就像curl
完成并关闭后,是否仍未提交mysql事务?
在升级到PHP 7.3之前,这从来都不是问题
任何日志/var/log/php7.3-fpm.log
,/var/log/nginx/error.log
,/var/log/mysql/error.log
中没有错误
答案 0 :(得分:0)
我不得不提交,因此mysql连接没有运行事务。请参阅问题中的更新
答案 1 :(得分:-1)
如果您具有主/从复制,则由于复制滞后而出现这种情况。您正在写入主服务器,该服务器写入其自己的数据库,然后从从属服务器读取。如果服务器没有时间完成同步,则在此处找不到插入的记录。
PHP 7比PHP 5快,并且使用新版本的PHP可能低于同步阈值。
您可以通过两种方式解决此问题:
从您正在写入的同一服务器上读取(推荐);
通过在读取值之前放置sleep(1)
来延迟从属服务器的读取,以等待同步完成(不建议这样做,因为您无法控制复制延迟,并且会导致代码较慢);