5

cronという名前のフォルダーの下にあるCakePHPルートフォルダーにファイルがあります。パスは次のとおりです。

c:/wamp/www/project/cron/daily.php

このファイルには、次のように、ケーキ構造のベンダーフォルダ内に配置された別のファイルが必要です。

require("/../vendors/phpMailer/class.phpmailer.php");

そして、私はこのdaily.phpをタスクスケジューラから実行します。これが私の開発サイト(Windowsシステム)のシナリオです。期待どおりに正常に動作します。プロジェクトをUbuntu(本番サイト)に移行すると、requireステートメントが問題を引き起こし始めました。必要なファイルが見つかりません。そこで、次のように小さな変更を加えました。

require("../vendors/phpMailer/class.phpmailer.php"); <= removed the preceding slash

そしてそれはうまくいった。ですから、私の疑問は、未亡人とLinuxで親ディレクトリ表記がどのように機能するかに違いがあるのでしょうか。もしそうなら、どうすればこれを克服できますか?プロジェクトを開発サイト(Windows)から本番サイト(Linux)に移動するたびにスラッシュを削除することは現実的ではありません。


私はこれを試しました:

 require("./../vendors/phpMailer/class.phpmailer.php");

Linuxで動作しました。しかし、Windowsで「そのようなファイルディレクトリはありません」というエラーが発生しました。Windowsは以下でのみ機能するようです:

 require("/../vendors/phpMailer/class.phpmailer.php");

解決

@TWCrapのヘルプから、問題は次のように解決されました。

require(dirname(__FILE__)."/../vendors/phpMailer/class.phpmailer.php");

WindowsとLinuxの両方で動作します(*喜びの涙*)。ただし、Windowsでは、次のようにパスが生成されます。

C:\wamp\www\project\cron/../vendors/phpMailer/class.phpmailer.php

この道は醜く見えます、そして私はそれが将来問題を引き起こさないことを願っています!

-みんなありがとう!

4

3 に答える 3

5

私が覚えているように、行の前に1つのドットを置くと、現在のディレクトリから開始します。したがって、行は次のようになります。

require("./../vendors/phpMailer/class.phpmailer.php");

そして、それはWindowsとLinuxで機能するはずです。

于 2012-09-07T10:57:21.197 に答える
1

本当に必要ない場合は、絶対パスを使用しないでください。正しく設定する方が安全で優れてinclude_pathいるため、移動する場合は、プロジェクト全体とそのすべてのファイルを掘り下げるのではなく、1つの設定を調整するだけで済みます。

ですから、私の疑問は、未亡人とLinuxで親ディレクトリ表記がどのように機能するかに違いがあるのでしょうか。

/(すなわち)で始まるパスは、開始がルートフォルダを示すため/foo/bar、絶対パスです。/Windowsでは、ドライブ文字が表示されます。

また、requireの重複を避けるために使用することをお勧めしrequire_onceます(HTMLとコードを混在させる場合は問題ありませんが、「スパゲッティコード」はお勧めしません)が、コードで問題が発生する可能性があります

于 2012-09-07T10:57:55.927 に答える
0

問題は、少なくともUNIXシステムでは、ファイルパスの前にスラッシュを付けて開始する場合、ルートから開始することです。

両方のシステムに./../*または単に../と書く必要があります。両方とも機能するはずです。

于 2012-09-07T10:58:22.337 に答える