0

我目前正在使用自动视频转换进行某种上传。目前,我正在上传完成后通过 php shell 命令执行 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);
                }
            }
        }
    }
?>

我将我的项目划分为代表功能的子文件夹,例如上传、我的帐户和图库.. 在每个子文件夹中还有 2 个其他文件夹:控制器和本地。控制器是控制这部分的类(例如上传),本地是我放置需要的本地类的文件夹。控制器类从位于子项目文件夹中的 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 函数相当陌生。在我看来,如果我的脚本正在调用 spl_autoload ,则不会调用:"php -f processVideo.php",不是吗?

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 回答