使用sys_exec()的MySQL过程

时间:2015-10-06 19:34:18

标签: php mysql function stored-procedures laravel-5.1

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

环境是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:~#

这里运行的是使用sys_exec()显示结果变量的debug_message,但是再次没有运行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> 

1 个答案:

答案 0 :(得分:0)

在这种情况下,Apparmor会阻止lib_mysqludf_sys次来电。快速aa-complain /usr/sbin/mysqld解决了这个问题。