1

shell_exec を呼び出してサードパーティのアプリケーションを起動する非常に単純な PHP スクリプトがあります。

どんなアプリケーション (notepad.exe を含む) を実行しようとしても、

スクリプトに shell_exec の呼び出しが含まれている場合、スクリプトは複数回呼び出されます。

スクリプトにこの呼び出しが含まれていない場合は、1 回だけ実行されます。

必要なソース コードを提供できます。何が見たいか教えてください。どこを見ればよいかまったくわかりません。

Windows 2008 R2、PHP 5.5.1、IIS 7.5、Amazon EC2 サーバー

いいえ、スクリプト内にループはありません。

file_put_contents('log.txt', $_SERVER['REQUEST_URI'], FILE_APPEND);

最初のスクリプト行として、ログに複数回書き込まれていることがわかります。

編集: 私のローカルホストでは起こりません。そして、それは exec でも起こります。

PHP スクリプトを最小限にまで削減:

<?php
//Report any errors
ini_set("MAX_EXECUTION_TIME", "-1");
ini_set('max_input_time', -1);
ini_set ("display_errors", "1");
error_reporting(E_ALL);

require_once('PhpConsole.php');
PhpConsole::start(true, true, dirname(__FILE__));

function writeLog($content, $logname)
{
    $temp = $content ." at " .date("D M j G:i:s T Y") ."\r\n";
    $f = fopen($logname, 'a+');
    fwrite($f,$temp,strlen($temp));
    fclose($f);
}

function createBackground()
{
    //Set the correct content type
    header('content-type: image/png');

    //Create our basic image stream 225px width, 225px height
    $image1 = imagecreate(1362, 762);

    // Set the background color
    $white = imagecolorallocate($image1, 255, 255, 255);

    // Save the image as a png and output
    imagepng($image1, "saves/back.png");

    // Clear up memory used
    imagedestroy($image1);
}

function buildFramesSequence()
{
    array_map('unlink', glob("saves/*"));
    array_map('unlink', glob("*.mp4"));
    unlink("list.txt");


    $url = realpath('') ."/" .$_GET["jfile"] ;
    $contents = file_get_contents($url);
    $results = json_decode($contents, true);

    $noOfFrames =  count( $results['ani']);
    $lastframe = "saves/back.png";

    createBackground();

    $elements = createElements($results['pre']);

    $frame_elements = array();
    $prev_element = null;

    for ($i = 0; $i <$noOfFrames; $i++)
    {
            $format = 'image%1$05d.png';
            $imgname = sprintf($format, $i);
            copy($lastframe, "saves/" .$imgname);
   }
}

function createVideo()
{
    writeLog("before build", "log.txt");
        buildFramesSequence();
    writeLog("after build", "log.txt");

    if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
        $localpath1 = realpath('') ."/ffmpeg/ffmpeg.exe";
    } else {
        $localpath1 = "ffmpeg";
    }

    $localpath2 = realpath('') ."/saves/image%05d.png";

    $mp3name = $_GET["mfile"];
    $localpath3 = realpath('') ."/" .$mp3name;

    $temp = substr($mp3name, 0, -1);
    $localpath4 = realpath('') ."/" .$temp ."4";

    writeLog(" before ffmpeg", "log.txt");

    $output =  shell_exec("notepad.exe");
    // $output =  shell_exec("ffmpeg $localpath1 .' -f image2 -r 20 -i ' .$localpath2 .' -i ' .$localpath3  .' -force_fps ' .$localpath4. ' 2>&1 &');
    // exec("notepad.exe", $output = array());

    //   debug($output);
    writeLog($localpath4, "list.txt");
    return $output;
}

file_put_contents('log.txt', $_SERVER['REQUEST_URI'], FILE_APPEND);
    set_time_limit(0);
    $output = createVideo();

    echo $output;
?>
4

1 に答える 1