php - 带有 sys_exec() 的 MySQL 过程

标签 php mysql function stored-procedures laravel-5.1

我正在尝试触发 Laravel 控制台 PHP 命令以将每个插入的行推送到我的客户端 UI,但是在安装 lib_mysqludf_sys 之后该过程似乎不起作用。 sys_exec()/sys_eval() 支持的库。

环境是Laravel Homestead Vagrant VM .这是运行 Ubuntu 14.04.3 和 MySQL 5.6.19-0ubuntu0.14.04.1。我还编译并成功安装了 lib_mysqludf_sys 库。

  • 在使用 sys_exec() 时,我在运行该过程时得到返回的退出代码 32512。
  • 使用 sys_eval() 时,在运行该过程时我的 debug_msg 输出中没有任何输出。
  • 使用 debug_msg 中回显的 cmd,它可以在 CLI 上手动运行而不会出现问题。
  • 没有 MySQL error.log 输出

有谁知道如何进一步解决这个问题?

DELIMITER $$

DROP PROCEDURE IF EXISTS homestead.debug_msg$$
DROP PROCEDURE IF EXISTS homestead.sessionActivity$$

CREATE PROCEDURE homestead.debug_msg(enabled INTEGER, msg VARCHAR(255))
BEGIN
  IF enabled THEN BEGIN
    select concat("** ", msg) AS '** DEBUG:';
  END; END IF;
END $$

CREATE PROCEDURE homestead.sessionActivity(id BIGINT)
BEGIN
  IF id THEN BEGIN
   DECLARE cmd CHAR(255);
   DECLARE result CHAR(255);
   SET cmd = CONCAT('/usr/bin/php /home/vagrant/Code/Laravel/artisan session:push ', id);
   SET result = sys_eval(cmd);
   #####SET result = sys_exec(cmd);
   call debug_msg(TRUE,cmd);
   #####call debug_msg(TRUE,result);
  END; END IF;
END$$

DELIMITER ;

这里运行 debug_msg 显示 cmd 变量:

mysql> CALL homestead.sessionActivity(74499);
+--------------------------------------------------------------+
| ** DEBUG:                                                    |
+--------------------------------------------------------------+
| ** php /home/vagrant/Code/Laravel/artisan session:push 74499 |
+--------------------------------------------------------------+
1 row in set (0.00 sec)

手动运行良好:

root@homestead:~# php /home/vagrant/Code/Laravel/artisan session:push 74499
string(259) "new line: some shit eol"
root@homestead:~#

这里运行时使用 debug_message 显示结果变量,使用 sys_exec(),但是同样,PHP 命令没有运行,并且没有其他输出或日志记录显示错误(这里的 sys_eval() 而不是 sys_exec() 输出将是空):

mysql> CALL homestead.sessionActivity(74499);
+-----------+
| ** DEBUG: |
+-----------+
| ** 32512  |
+-----------+
1 row in set (0.01 sec)

奇怪的是,虽然 lib_mysqludf_sys 安装创建了函数,但它们并没有显示在 show function status 中。我不确定这是否相关。

mysql> CREATE FUNCTION lib_mysqludf_sys_info RETURNS string SONAME 'lib_mysqludf_sys.so';
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE FUNCTION sys_get RETURNS string SONAME 'lib_mysqludf_sys.so';
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE FUNCTION sys_set RETURNS int SONAME 'lib_mysqludf_sys.so';
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE FUNCTION sys_exec RETURNS int SONAME 'lib_mysqludf_sys.so';
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE FUNCTION sys_eval RETURNS string SONAME 'lib_mysqludf_sys.so';
Query OK, 0 rows affected (0.00 sec)

mysql> show function status;
Empty set (0.01 sec)

mysql> 

最佳答案

在这种情况下,lib_mysqludf_sys 调用被 Apparmor 阻止。快速 aa-complain/usr/sbin/mysqld 解决了这个问题。

关于php - 带有 sys_exec() 的 MySQL 过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32978203/

相关文章:

mysql - 需要修改 dbmaintain 脚本来处理 mysql 语法变化

C++ 写奇怪的符号而不是字符

javascript - 强制一个 javascript 函数等待运行,直到第一个函数完成

php - 在 php 中发送邮件时如何删除显示系统信息的 header

php 发送邮件(邮件正文取自数据库)

php - 不打印 ID,而是打印 'Array' ?

mysql - SQL - 每个 ID 只显示一行

php - 如何发送带有警报的 jquery $.post

php - 被黑了!这段 PHP 代码有什么作用?我应该如何避免?

与 char* 冲突的类型