-1

自動更新プログラムが後で使用できるように、ファイルをデータベースにロードする一連の PHP スクリプトがあります。ファイルが 10MB の範囲を超えるまで、プログラムは正常に動作します。スクリプトの大まかなアイデアは、特定の場所にあるディスクからファイルを取得し、それらをデータベースにロードすることです。これにより、ソース管理に保存し、必要に応じてセットで更新できます。

最初は、最初の検索に基づいて、データベース SQL の制限に達していると思いました。ただし、さらにテストした結果、PHP 固有のもののようです。Apache エラー ログを確認しましたが、このスクリプトまたはインクルードにエラーは見られませんでした。PHPスクリプトがaddslashes関数に到達すると、スクリプトの実行が停止したように見えます。(各スクリプト ステートメントの間に echo ステートメントを追加しました。)

私が見逃しているのは簡単なことだと思っていますが、数時間オンラインで検索しても、addslashes の失敗に関連するものは見つかりませんでした。

何か案は?

前もって感謝します。

mysql_connect('localhost', '****', '****') or die('Could not connect to the database');
mysql_select_db('****') or die('Could not select database');

function get_filelist($path)
{
        return get_filelist_recursive("/build/".$path);
}
function get_filelist_recursive($path)
{
        $i = 0;
        $list = array();
        if( !is_dir($path) )
                return get_filedetails($path);

        if ($handle = opendir($path))
        {
                while (false !== ($file = readdir($handle)))
                {
                        if($file!='.' && $file!='..' && $file[0]!='.')
                        {
                                if( is_dir($path.'/'.$file) )
                                {
                                        $list = $list + get_filelist_recursive($path.'/'.$file);
                                }
                                else
                                {
                                        $list = $list + get_filedetails($path.'/'.$file);
                                }
                        }
                }
                closedir($handle);
                return $list;
        }
}
function get_filedetails($path)
{
        $item = array();
        $details = array();
        $details[0] = filesize($path);
        $details[1] = sha1_file($path);
        $item[$path] = $details;
        return $item;
}

$productset = mysql_query("select * from product where status is null and id=".$_REQUEST['pid']);
$prow = mysql_fetch_assoc($productset);

$folder = "product/".$prow['name'];
$fileset = get_filelist($folder);
while (list($key, $val) = each($fileset))
{
    $fh = fopen($key, 'rb') or die("Cannot open file");
    $data = fread($fh,$val[0]);
    $data = addslashes($data);
    fclose($fh);
    $filename = substr( $key, strlen($folder) + 1 );
    $query = "insert into file(name,size,hash,data,manifest_id) values('".$filename."','".$val[0]."','".$val[1]."','".$data."','".$prow['manifest_id']."')";
    $retins = mysql_query($query);
    if( $retins == false )
        echo "BUILD FAILED: $key, $val[0] $val[1].<br>\n";
}

header("Location: /patch/index.php?pid=".$_REQUEST['pid']);
4

1 に答える 1

1

アッドラッシュは使用しないでくださいmysql_real_escape_string。この場合に使用してください。また、このような大きなファイルを挿入しようとすると、 max_allowed_pa​​cketの制限に達する可能性があります。デフォルト値は1MBです。

mysqli (推奨)を使用する場合は、列がバイナリであることを示すことができ、クエリがチャンクで送信されます。

また、PHPのメモリ制限や最大実行時間に達していないことを確認してください。

于 2012-06-10T07:48:07.400 に答える