PHP,Zend,require_once:“无法打开流”和“无法打开所需[...]”

时间:2012-06-25 11:35:27

标签: php zend-framework filesystems include

我疯了!我现在一直在和谷歌搜索2小时。

简而言之,事情进展顺利,然后我做了一些阶级重组,现在我得到了这个:

    Warning: require_once(Zend/Mail/Transport/Sendmail.php) [function.require-once]: failed to open stream: No such file or directory in /nfs/c09/h02/mnt/136160/domains/xyz.com/html/sandbox/Zend/Mail.php on line 1175

    Fatal error: require_once() [function.require]: Failed opening required 'Zend/Mail/Transport/Sendmail.php' (include_path='.:/usr/local/php-5.3.13/share/pear') in /nfs/c09/h02/mnt/136160/domains/xyz.com/html/sandbox/Zend/Mail.php on line 1175

我没有触及我的文件的组织方式:

    sandbox/index.php
    sandbox/settings.php
    sandbox/lib/class1.php
    sandbox/lib/class2.php
    sandbox/lib/class3.php
    sandbox/Zend/...

我只更改了一些类名及其层次结构。

的index.php

<?php
    require_once 'lib/class1.php';
    $application = new class1();
    $application->run();
?>

class1.php

<?php

    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Log');
    Zend_Loader::loadClass('Zend_Log_Formatter_Simple');
    Zend_Loader::loadClass('Zend_Log_Writer_Mail');
    Zend_Loader::loadClass('Zend_Log_Writer_Stream');
    Zend_Loader::loadClass('Zend_Mail');

    // class definition ...
?>

在课堂重组期间,这些require都不需要触及。 Zend的 Mail.php 中出现了具体问题(虽然我确定存在更普遍的问题):

/**
 * Sends this email using the given transport or a previously
 * set DefaultTransport or the internal mail function if no
 * default transport had been set.
 *
 * @param  Zend_Mail_Transport_Abstract $transport
 * @return Zend_Mail                    Provides fluent interface
 */
public function send($transport = null)
{
    if ($transport === null) {
        if (! self::$_defaultTransport instanceof Zend_Mail_Transport_Abstract) {
            require_once 'Zend/Mail/Transport/Sendmail.php';
            $transport = new Zend_Mail_Transport_Sendmail();
        } else {
            $transport = self::$_defaultTransport;
        }
    }

    ...
}

(注意仅在第一次发送电子邮件时如何调用require。)

  1. 新的“流量”或包含顺序是否可能导致此问题? (因为路径似乎没问题。如果路径不合适,它会在Loader.php死掉,不是吗?)

  2. 某种类型的循环依赖会导致这个问题,然后才会导致更“致命”吗?

  3. 类名是否可能与已存在的内容冲突?以前我有一些相当神秘的类名,如MalaFwk_Application_Receiver。现在,名称更通用,例如CApplication,CComponent,CDatabase,CLogger等

  4. 我尝试过在其他SO线程中提出的各种建议无济于事,但我愿意尝试任何有人建议的事情。如果这不是一个特别具有建设性的问题,我会事先道歉,但是我没有想法,并且有太多(微不足道但广泛的)变化来恢复并重新应用这些变化。任何帮助将不胜感激。 (我将在美国东部时间早上8点到45点回来。)

    更新

    如果我将以下行添加到 index.php ,即在其他任何事情发生之前“手动”需要该文件,那么事情就会重新开始。

        require_once 'Zend/Mail/Transport/Sendmail.php';
    

    因此,出于某种原因,当代码到达send()时,它似乎无法找到库。什么可能导致这种情况?

1 个答案:

答案 0 :(得分:3)

请将其添加到您的索引中:

set_include_path(implode(PATH_SEPARATOR, array(          
    realpath('../library'), // Make sure this is the correct path to your library folder
    get_include_path(),
)));