亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

GD庫出現白屏問題如何解決?

GD庫出現白屏問題如何解決?

PHP
慕婉清6462132 2023-04-21 17:15:42
我在 GD PHP 庫中遇到問題。當我將圖像發送到本地主機 VM 時,圖像通常會在屏幕上生成,但是當我嘗試在 VPS 上執行此操作時,我不會生成圖像并且屏幕是白色的。我已經檢查過兩臺機器上的 lib GD 是否相同,一切似乎都沒問題。以下是我在屏幕上生成圖像的代碼:    $image = imagecreatefrompng((isset($_SERVER['HTTPS']) ? "https" : "http") . "://$_SERVER[HTTP_HOST]" . "/wp-content/uploads/cart1.png");    $imageCart = imagecreatefrompng($perfil);    $titleColor = imagecolorallocate($image, 255, 255, 255);    $gray = imagecolorallocate($image, 100, 100, 100);    $black = imagecolorallocate($image, 0, 0, 0);    imagecopymerge($image, $imageCart, 60, 177, 0, 0, imagesx($imageCart), imagesy($imageCart), 100);    imagestring($image, 5, 170, 175, "NOME  " . strtoupper($nomeCompleto), $titleColor);    imagestring($image, 5, 170, 205, "CPF  " . $cpf, $titleColor);    imagestring($image, 5, 170, 235, "MATRICULA  " . $matricula, $titleColor);    imagestring($image, 5, 170, 263, "DT NASCIMENTO " . $dtnacimento, $titleColor);    header("Content-type: image/png");    imagepng($image);    imagepng($imageCart);    imagedestroy($image);    imagedestroy($imageCart);
查看完整描述

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 設置了一些它自己的項目目錄常量,因此在這種情況下也可以使用它們。


查看完整回答
反對 回復 2023-04-21
  • 1 回答
  • 0 關注
  • 123 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號