我一直在网上倾盆而下似乎无法找到问题的解决方案。
我有一个简单的表单用于上传矢量图形(ai,eps,pdf,svg),它们将imagemagik转换为jpgs,并将这两个文件存储在MSSql 2000的“图像”字段中。
对于上传超过16兆的任何内容,我们收到错误“MSSQL错误:将数据库上下文更改为'out-database'。
我知道它不是存储这些文件的首选方式......但在我们开始接收大文件之前,它已经完美无缺地运行了。它对于我们如何处理版本和安全性也很方便。
我正在追踪apache和php日志文件,发生这种情况时无法找到记录的错误!?
网络服务器和mssql服务器是装载ram并且位于同一千兆位交换机上的强大机器,所以我不担心性能。我只是需要它才能工作。
同样,对于16megs以下的任何东西,这都能完美无缺,我无法找到任何地方。
**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的十六进制字符串的最大长度?
非常感谢任何帮助!
谢谢!
答案 0 :(得分:0)
我遇到了大型文件和PHP的类似问题,并使用这里描述的PHP FTP扩展来解决它
“http://au.php.net/manual/en/book.ftp.php”
然后我使用mysql.exe和shell_exec()运行我的查询,您也可以从Web应用程序运行查询。
如果您决定继续使用表单,请检查php.ini中post_max_size变量的大小,表单帖子可能是瓶颈。