Php Apache2 插入大型二进制 MSSQL 错误 : Changed database context to 'database'

标签 php sql-server insert binary apache2

我一直在网络上倾诉,似乎无法找到解决我的问题的方法。

我有一个用于上传矢量图形(ai、eps、pdf、svg)的简单表格,它使用 imagemagik 将它们转换为 jpg,并将这两个文件存储在 MSSql 2000 的“图像”字段中。

我们收到错误“MSSQL 错误:已将上传超过 16 兆的任何内容的数据库上下文更改为‘out-database’。

我知道这不是存储这些文件的首选方式...但在我们开始接收大文件之前,它对我们来说一直很完美。它对于我们处理版本和安全性的方式也很方便。

我正在跟踪 apache 和 php 日志文件,但在发生这种情况时找不到记录的单个错误!?

网络服务器和 mssql 服务器是具有大量 ram 的强大机器,并且位于同一个千兆交换机上,所以我不担心性能。我只需要它工作。

同样,这对我在任何地方都找不到任何引用的 16 兆以下的任何东西都可以完美地工作。

**Our Web Server Specs**
2.6.38-11-server #50-Ubuntu
PHP Version 5.3.5-1ubuntu7.7
Apache Version  Apache/2.2.17 (Ubuntu)
Apache API Version  20051115
Max Requests    Per Child: 0 - Keep Alive: on - Max Per Connection: 100
Timeouts    Connection: 300 - Keep-Alive: 15

**Php mssql settings**
MSSQL Support   enabled
Active Persistent Links 0
Active Links    0
Library version FreeTDS
Directive   Local Value
mssql.allow_persistent  On
mssql.batchsize 0
mssql.charset   no value
mssql.compatability_mode    Off
mssql.connect_timeout   90
mssql.datetimeconvert   On
mssql.max_links Unlimited
mssql.max_persistent    Unlimited
mssql.max_procs Unlimited
mssql.min_error_severity    11
mssql.min_message_severity  11
mssql.secure_connection Off
mssql.textlimit 2147483647
mssql.textsize  2147483647
mssql.timeout   180

**Other relevant php.ini settings**
max_execution_time = 300
max_input_time = 300
memory_limit = 512M
post_max_size = 300M
upload_file_size = 300M
default_socket_timeout = 60
odbc.defaultlrl = 2147483647
odbc.defaultbinmode = 1

相关代码片段:

        $f1 = ("" .$outloc . $clean1 . "");
        $f1string  =  file_get_contents($f1); 
        $f1data  =  unpack("H*hex", $f1string);
        $cf1 = ("" .$outloc . $confilename1 . $outext . "");
        $cf1string  =  file_get_contents($cf1); 
        $cf1data  =  unpack("H*hex", $cf1string);
        $cf1name = ("" .$confilename1 . $outext. "");

        //Upload to database
        $query_result  =  mssql_query("INSERT INTO art_converted_table (image_blob,filename,comment,received_dt,image_name,contact_email,po_number,upload_blob,upload_mime,upload_filename) VALUES (0x".$cf1data['hex'].",'$cf1name','$ccomment','$received_dt','$clean1','$email','$cponum',0x".$f1data['hex'].",'$file1type','$clean1')", $db_conn)
        or die('MSSQL error: ' . mssql_get_last_message());

我已经尝试在解包过程之后手动添加 sleep() 计时器,以防出现问题。我只是不明白为什么会这样。

是否有可以插入到 mssql 中的十六进制字符串的最大长度?

如有任何帮助,我们将不胜感激!

谢谢!

最佳答案

我遇到了大文件和 PHP 的类似问题,并通过使用 PHP FTP 扩展解决了这个问题,如此处所述

“http://au.php.net/manual/en/book.ftp.php”

然后我使用 mysql.exe 和 shell_exec() 运行我的查询,您也可以从您的 Web 应用程序运行查询。

如果您决定继续使用表单,请检查 php.ini 中 post_max_size 变量的大小,表单发布可能是瓶颈。

关于Php Apache2 插入大型二进制 MSSQL 错误 : Changed database context to 'database' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10047280/

相关文章:

mysql - fork MySQL INSERT INTO (InnoDB)

mysql - 访问mysql中最后插入的行

php - 在 linux/freebsd/macosx 上使用 PHP 查找实用程序的安装路径

javascript - 如何使用 Twig 中实体的现有数据预先填充集合原型(prototype)?

sql-server - 子句之间的时态表 - 包含不应该包含的行?

sql-server - 加入群组中的最大日期记录

sql - 用于多个字段上的键集分页的通用 SQL 谓词

php - 从数据库打印数据到html表

javascript - Jquery 对话框不提交表单

c - 使用 for 循环插入二叉搜索树 (C)