0

私は現在、自動ビデオ変換を使用したある種のアップロードに取り組んでいます。現時点では、アップロードが完了した後、phpシェルコマンドを使用してphpスクリプトを実行しているため、ユーザーは変換が完了するまで待つ必要はありません。そのようです:

protected function _runConversionScript() {
    if (!exec("php -f '" . $this->_conversionScript . "' > /dev/null &"))
        return true;

    return false;
}

現在、変換スクリプトファイルで、別のクラス「UploadFunctions」の関数を使用して、データベースのステータス(開始、変換、終了など)を更新しています。ただし、このUploadFunctionsクラスは、たとえばデータベース接続が確立される別のクラス「Controller」を継承するという問題があります。現在、spl_autoloaderを使用して、必要なファイル(controller.phpなど)の特定のディレクトリを検索していますが、変換スクリプトはオートローダー全体のコンテキストから外れているため、Controllerクラスを認識せず、致命的なphpエラーをスローします。変換スクリプトのコードは次のとおりです。

require_once('uploadfunctions.php');

$upload_func = new UploadFunctions();

// we want to make sure we only process videos that haven't already
// been or are being processed
$where = array(
    'status' => 'queued'
);
$videos = $upload_func->getVideos($where);

foreach ($videos as $video) {

    // update database to show that these videos are being processed
    $update = array(
        'id' => $video['id'],
        'status' => 'started'
    );
    // execute update
    $upload_func->updateVideo($update);
.........

私はこれを完全に間違ってやっていますか、それともこれを達成するためのより良い方法がありますか?さらにコードや情報が必要な場合はお知らせください。どうもありがとう

これが私のspl_autoloadコードです:

<?php
spl_autoload_register('autoloader');

function autoloader($class_name) {
        $class_name = strtolower($class_name);

        $pos = strpos($class_name ,'twig');

        if($pos !== false){
            return false;
        }

        $possibilities = array(
            '..'.DIRECTORY_SEPARATOR.'globals'.DIRECTORY_SEPARATOR.$class_name.'.php',
            'controller'.DIRECTORY_SEPARATOR.$class_name.'.php',
            '..'.DIRECTORY_SEPARATOR.'libs'.DIRECTORY_SEPARATOR.$class_name.'.php',
            'local'.DIRECTORY_SEPARATOR.$class_name.'.php'
        );

        foreach ($possibilities as $file) {

            if(class_exists($class_name) != true) {
                if (file_exists($file)) {

                    include_once($file);
                }
            }
        }
    }
?>

プロジェクトをサブフォルダーに分割し、アップロード、myaccount、ギャラリーなどの機能を表します。すべてのサブフォルダーには、コントローラーとローカルの2つのフォルダーもあります。Controllerは、この部分を制御するクラス(たとえば、アップロード)であり、localは、必要なローカルクラスを配置するフォルダーです。コントローラクラスは、サブプロジェクトフォルダにあるindex.phpから呼び出されます。「libs」と「global」は、データベース、ユーザーなどのプロジェクト全体のクラスです。これは私のフォルダ構造の例です:

www /index.php//メインサイト

www / upload / index.php //アップロードのためにコントローラーを呼び出し、spl_autoloadを初期化します

www / upload / controller /indexcontroller.php//アップロードの機能

www / upload / local /processVideo.php//これは変換スクリプトです。

私はspl_autoload関数にかなり慣れていません。私の意見では、スクリプトが「php -f processVideo.php」を呼び出している場合、spl_autoloadは呼び出されませんね。

4

2 に答える 2

0

PHP相対パスは、PHPバイナリが呼び出されるパスから計算されます。

__DIR__その動作を避けるために定数を使用することをお勧めします

http://php.net/manual/en/language.constants.predefined.php

于 2012-09-14T17:03:47.527 に答える
0

私は実際に問題を解決することができました。ファイルを見つけることができるように、変換スクリプト内にspl_autoload_register関数を含める必要がありました。変換スクリプトがフレームワークに組み込まれていないため、フレームワークオートローダーからクラスをロードできないため、これは問題でした。

于 2012-09-14T19:52:51.657 に答える