1 回答

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