Php Apache2 插入大型二进制MSSQL错误:已更改数据库上下文为“数据库”。

3
我一直在网上搜索,但似乎找不到解决我的问题的方法。
我有一个简单的表单用于上传向量图形(ai、eps、pdf、svg),使用imagemagik将它们转换为jpg并将两个文件存储在MSSql 2000的“image”字段中。
我们收到错误消息:“MSSQL错误:对于超过16兆字节的任何上传内容,已更改数据库上下文为'out-database'。”
我知道这不是存储这些文件的首选方式...但它在我们收到大文件之前一直完美地工作。 它还很方便,因为我们可以处理版本和安全性。
当发生这种情况时,我正在跟踪apache和php日志文件,但找不到任何记录的错误!
Web服务器和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中可以插入的十六进制字符串长度是否有最大限制?

任何帮助都将不胜感激!

谢谢!


为了确保这不是SQL服务器本身的问题,我在我们的IIS服务器上创建了一个ASP页面,并能够轻松上传100多兆字节的文件。这绝对是PHP的问题... 哎呀! - user1317923
1个回答

0

我在处理大文件和 PHP 相关问题时遇到了类似的情况,通过使用 PHP FTP 扩展来解决,具体方法可以参考这里。

"http://au.php.net/manual/en/book.ftp.php"

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接