php - 从 PHP 脚本调用 mySQL 存储过程 - 没有错误但不执行?

标签 php mysql stored-procedures adminer

  • 最后更新

我正在关注这个 Automatic Partition Maintenance in MySQL 教程,该教程详细介绍了根据日期范围删除和添加 mySQL 表分区的通用方法。

这个想法是,您可以在一定时间后自动丢弃旧表数据,并根据需要为当前数据创建新的表分区。

但是,由于我的网站可能托管在“共享”提供程序包上,因此我可能无法使用 mySQL 事件。

因此,我正在对第一个教程中描述的存储过程进行交叉施肥,并使用另一种调用它们的方法,即使用此 Stack Overflow 答案中详细介绍的方法,并进行一些修改:Partition maintainance script for Mysql

在我的本地测试机器上,我想从 Webmin 将 PHP 脚本作为 CRON 作业运行。

当我使用 AdminermySQL test database (具有与 phpMyAdmin 类似的功能)运行存储过程时,它们按预期执行 - 分区被删除,整个过程需要几分钟才能完成。

但是,当我从 Webmin 将修改后的 PHP 脚本作为 CRON 作业运行时,似乎什么也没有发生。没有错误,但脚本立即返回“OK”。

同样,当我从 LAMP 计算机的 shell 运行脚本时,它会立即返回“OK”。

这是 PHP 脚本:

#!/usr/bin/env php
<?php
$connection = mysqli_connect('localhost', 'my_username', 'my_password', 'employees');
$result = mysqli_query($connection, "CALL perform_partition_maintenance('employees', 'titles', 3, 216, 5)") or die('Query fail: ' . mysqli_error($connection));
if ($result)
  echo "OK";
else
  echo "FAIL";
mysqli_close($connection);

对于任何有关我可能出错的地方的建议,我将非常感激。

<小时/>

更新

根据 Nick 的建议,我添加了很多调试语句。我走了一条稍微不同的路线,因为它更容易做到一些 - 许多新的“into outfile”语句。

但是我所观察到的情况让我感到困惑。存储过程的一小部分如下:

OPEN cur1;
    read_loop: LOOP
      FETCH cur1 INTO current_partition_name;
      IF done THEN
         LEAVE read_loop;
      END IF;

      IF ! @first AND p_seconds_to_sleep > 0 THEN
        SELECT CONCAT('Sleeping for ', p_seconds_to_sleep, ' seconds');
        SELECT SLEEP(p_seconds_to_sleep);
      END IF;

      SELECT CONCAT('Dropping partition: ', current_partition_name);

      ...

      SET @first = FALSE;
    END LOOP;
  CLOSE cur1;

这一切均取自 Geoff Montee 页面上的网络教程,未经修改,并且在其他上下文中完美运行(即,在 Adminer 中,从 sql 控制台 - 只是不与 PHP 脚本结合使用)。 但是,当我注释掉以下行时:

SELECT CONCAT('Dropping partition: ', current_partition_name);

一切都工作得很好,但是当我把那条线放回去时,脚本就卡住了。我无法理解这一点。特别是在测试中,我在循环的前三次迭代中将“current_partition_name”写入磁盘上的文件中,并且在这种情况下引用该字符串不会导致任何问题。这很奇怪。

This other (apparently unresolved) stackoverflow question 听起来有些相似。

最佳答案

后来,我意识到当表具有外键时分区不可用。我不确定当我第一次探索分区作为一种选项时我是如何错过这个基本细节的。

这非常不幸,因为它使整个练习变得多余。我将不得不研究某种涉及传统表删除的解决方案,以及所有相关的令人头痛的问题。

<小时/>

另外,我还没有更深入地理解为什么注释掉 Geoff Montee 的存储过程中的特定行对于允许函数在从 PHP 调用时成功运行至关重要。我很想将其归咎于解释器错误(我在测试环境中运行 mySQL 5.5.62),但正如前面提到的,从管理员启动时存储过程可以完美执行。

关于php - 从 PHP 脚本调用 mySQL 存储过程 - 没有错误但不执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54090866/

相关文章:

php 或 mysql 在导入数据库时​​卡住

mysql - MYSQL中子字符串与正则表达式的使用

mysql - 组连接将mysql中不同表中的两个值相除

php - CSV 到键值对

sql-server - 如何从另一台服务器中的存储过程运行作业?

php - 通过 JavaScript 或 PHP 使用 Google map API?

php - 如果单个数字前导、结束或存在于与另一个字符分开的字符串的中间,则将 0 添加到单个数字前面

PHP 如何找出 memcached 数组的文件大小

c# - 具有表值参数的 Dapper 动态参数

PHP/mySQL - 当新用户提交数据时定期重新计算基准值