1 回答

TA貢獻1789條經驗 獲得超10個贊
這個問題很有趣,因為本地和遠程服務器環境在評論中被報告為相同。通常的問題是gd擴展安裝在一個中,而在另一個中丟失,但這里不是這種情況。他們甚至被報告為具有相同的內部版本號。
所以第一個問題就在這里:
imagepng($image);
imagepng($imageCart);
該imagepng()函數獲取圖像的二進制數據并將其發送到/dev/stdout,Web 服務器將在此處捕獲該數據,并傳輸到發出請求的客戶端。擁有其中兩個可能會產生奇怪的結果,因為瀏覽器將看到兩個連接的 PNG 圖像。如評論中所述,這可能適用于某些瀏覽器,但可能不適用于其他瀏覽器 - 換句話說,我們不能依賴它工作。最好只發送有效輸出,即使在某些情況下我們可以讓它工作(在它工作的地方,瀏覽器可能使用第一個而丟棄第二個)。所以要做的第一件事就是只發送一張圖片。
下一個問題是在這一行中,通過調試發現:
$image = imagecreatefrompng((isset($_SERVER['HTTPS']) ? "https" : "http") .
"://$_SERVER[HTTP_HOST]" .
"/wp-content/uploads/cart1.png");
本質上,這會通過 HTTP/HTTPS 加載源 PNG 圖像。這利用了 PHP 中允許使用 URL 代替文件路徑的功能。從手冊:
如果啟用了fopen 包裝器,則 URL 可以用作此函數的文件名。有關如何指定文件名的更多詳細信息,請參見fopen() 。請參閱支持的協議和包裝器以獲取有關各種包裝器具有哪些功能的信息的鏈接、它們的使用說明以及它們可能提供的任何預定義變量的信息。
我會冒險猜測你allow_url_fopen在本地機器上是真的,而在你的 VPS 上是假的或沒有設置。這本可以通過遠程更改來實現,但所做的修復可能更好——那就是直接從文件系統加載它。
如果您使用 fopen 包裝器,那么您實際做的是向 Web 服務器發出請求,該請求從磁盤獲取圖像,然后通過 curl 將其返回。因此,通過直接使用其文件名獲取圖像,您可以“省去中間人”并更有效地獲取圖像。
在這些情況下通常使用目錄遍歷運算符來創建相對于腳本目錄的路徑名。使用的一個非常好的解決方案是:
imagecreatefrompng("../../../wp-content/uploads/cart1.png")
您還可以使用魔術變量(假設腳本是從項目根目錄向下三層):
$projectDir = realpath(__DIR__ . "/../../..");
imagecreatefrompng($projectDir . "/wp-content/uploads/cart1.png")
您可能會發現 WordPress 設置了一些它自己的項目目錄常量,因此在這種情況下也可以使用它們。
- 1 回答
- 0 關注
- 123 瀏覽
添加回答
舉報