您是否有机会使用共享主机?如果是这样,这可能会对您有所帮助。
我刚刚花了一天的大部分时间来处理 Magento Connect Manager 2.0,试图让它与 FTP 选项一起工作。我什至无法将我的任何设置保存在设置选项卡上,它只是一直恢复为默认值。
我最终将问题归结为 Magento 坚持使用 sys_get_temp_dir 来确定临时目录。这通常不适用于共享主机,因为您没有 /tmp 的写入权限。不幸的是,失败时不会产生任何错误,Magento 只是继续运行,但不会保存或加载 Magento Connect FTP 设置。我之前在核心代码的其他地方也遇到过类似的问题。
我在 /var/tmp 的主安装下创建了一个临时文件夹,并使其可全局写入。
/downloader 和 /lib/Mage 中有 11 个地方使用此函数来确定临时文件夹。这些将需要更改为指向您决定放置临时文件夹的位置。我不确定它们是否都需要更改,或者它们都做了什么,但为了安全起见,我更改了它们。详情见文末。行号是近似值,但只需在每个文件中搜索 sys_get_temp_dir。
进行更改后,您需要确保以下文件夹是世界可写的,递归:
/var/package/tmp/
/downloader/.cache
/media
FTP 选项的优点是 Magento 根不再需要是可写的。
以下任何更改都可能会破坏 Magento Connect,尤其是标有 ** 的更改。我已经完成了它们,并运行了一个似乎一切正常的模块安装,但我对它们不做任何保证。它们在某些地方也有点混乱,我相信它们可以改进 - 在某些情况下可能有更好的方法来获取 magento_root。请注意,不同的子文件夹中有类似名称的文件。
不过,希望他们能拯救经历我今天的麻烦的人。如果 Varien 只编写他们自己的 tmpDir 函数并让您在管理员中指定一个临时文件夹,那将是一个很大的帮助,节省大量的麻烦。呃,好吧。
下载器\lib\Mage\Connect\Config.php,第 207 行:
// $tempFile = tempnam(sys_get_temp_dir(),'config');
$tempFile = tempnam($this->magento_root. '/var/tmp/' ,'config');
下载器\lib\Mage\Connect\Command\Registry.php,第 315 行:
//$localXml = tempnam(sys_get_temp_dir(),'package');
$magento_root = dirname(dirname(__FILE__)) . '/../../../..';
$localXml = tempnam($magento_root. '/var/tmp/' ,'package');
下载器\lib\Mage\Connect\Loader\Ftp.php,第 107 行:
// $tmpDir = sys_get_temp_dir();
$magento_root = dirname(dirname(__FILE__)) . '/../../../..';
$tmpDir = $magento_root . '/var/tmp/';
下载器\Maged\Controller.php,869**:
//$tempFile = tempnam(sys_get_temp_dir(),'maintenance');
$tempFile = tempnam($config->__get('magento_root') . '/var/tmp/' ,'maintenance');
为了保存您的配置更改需要这个:
downloader\Maged\Model\Connect.php,404:
//$tempFile = tempnam(sys_get_temp_dir(),'config');
$tempFile = tempnam($configObj->magento_root. '/var/tmp/' ,'config');
下载器\Maged\Model\Config\Abstract.php,88**:
// $tempFile = tempnam(sys_get_temp_dir(),'configini');
$magento_root = dirname(dirname(__FILE__)) . '/../../..';
$tempFile = tempnam($magento_root. '/var/tmp/' ,'configini');
downloader\lib\Mage\Connect\Packager.php - 其余 5 项更改在此文件中。
第 96 行 - 我相信这是将配置更改加载到设置屏幕所需的行:
// $tempConfigFile = tempnam(sys_get_temp_dir(),'conf');
$magento_root = dirname(dirname(__FILE__)) . '/../../..';
$tempConfigFile = tempnam($magento_root . '/var/tmp/' ,'conf');
第 111 行:
// $tempCacheFile = tempnam(sys_get_temp_dir(),'cache');
$magento_root = dirname(dirname(__FILE__)) . '/../../..';
$tempCacheFile = tempnam($magento_root . '/var/tmp/' ,'cache');
大约 135 处,在 if 语句之前:
$magento_root = dirname(dirname(__FILE__)) . '/../../..';
然后在 if 和 else 部分:
// $configFile=tempnam(sys_get_temp_dir(),'conf');
$configFile = tempnam($magento_root. '/var/tmp/' ,'conf');
158:
//$tempConfigFile = tempnam(sys_get_temp_dir(),'conf_');
$magento_root = dirname(dirname(__FILE__)) . '/../../..';
$tempConfigFile = tempnam($magento_root. '/var/tmp/' ,'conf_');