laravel 10
php 8.2
cpanel 110.0.39
我在 seeder 寫了匯入功能,在我的 Windows11, vmware Ubuntu 2204 都正常。但伺服器主機使用 cpanel,卻無反應,而且沒有任何錯誤訊息。
database\seeders\DatabaseSeeder.php
$this->call([
TimezoneCsvSeeder::class,
// UserSeeder::class,
ManagerSeeder::class,
MemberSeeder::class,
CountryXlsxSeeder::class,
LanguageSeeder::class,
TranslationSeeder::class,
...
database\seeders\CountryXlsxSeeder.php
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Schema;
use App\Models\MasterData\Country;
use Maatwebsite\Excel\Facades\Excel;
class CountryXlsxSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Schema::disableForeignKeyConstraints();
Country::truncate();
$filename = 'database/sheets/ImportSheets/countries.xlsx';
if (is_file($filename)) {
echo "doing CountryImport";
Excel::import(new \Database\Sheets\ImportClasses\CountryImport, $filename);
}else{
echo $filename . ' file not exists';exit;
}
Schema::enableForeignKeyConstraints();
}
}
執行
$ ea-php82 artisan db:seed --class=CountryXlsxSeeder
...
INFO Seeding database.
doing CountryImport
$_
為什麼要用 ea-php82,因為這是多版本 php 的 cpanel。
database\sheets\ImportClasses\CountryImport.php
<?php
namespace Database\Sheets\ImportClasses;
use App\Models\MasterData\Country;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithStartRow;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
class CountryImport implements ToModel,WithStartRow,WithMultipleSheets,WithHeadingRow
{
public function model(array $row)
{
$model = new Country([
'code' => $row['code'],
'name' => $row['name'],
'native_name' => $row['native_name'],
'iso_code_3' => $row['iso_code_3'],
]);
return $model;
}
public function startRow(): int
{
return 2;
}
public function sheets(): array
{
return [
'countries' => $this,
];
}
}
基本上很少會在seed上引用 excel 的資料來做匯入。
畢竟seed的用意在於初始化資料用居多。
實在不該再來處理轉換資料這件事才對。
當然,這不是你本篇主題的問題。
你可以先在你的引入程式
加一段 dump($model) 看看是否有正確拿到資料否。
畢竟如果轉換不到資料,它也不會報錯沒錯。
記得ENV的DEBUG模式先打開。
搞不好有出錯只是沒顯示。
但一般還是會建議使用 json 之類的資料做導入處理。
盡量不要再做轉換資料的動作。
不懂你的點。excel就是做seeders的事。excel結構化匯入,整理方便。
debug有開,其它錯誤會顯示。
CountryImport 做 dd($model) 結果一樣,沒進到這裡。
我明白你用 excel 來當 seed 的來源資料這個點。
但一般 seed 的原意在於初始化資料用居多。
而且使用 excel 很容易發生資料來源轉換不確實而 seed 資料不運行的問題存在。
因為很容易發生編碼問題或是轉譯資料上的問題。
所以才會說,一般並不建議在SEED上使用 excel 來做來源資料。
當然,我也明白你會用 excel 的原因。就是認為整理資料方便。
但如果是為了一個只做一次資料匯入的情況下用 excel
還是覺得不妥。
如果是常態性的資料變動處理。我就不太建議用seed來處理了。
看你要怎麼做,我是沒意見啦!
畢竟只是告訴你一般seed使用上處理。及適合的方式。
當然你想用 excel 來當來源資料也不是不行。
但就是你得面對你當前碰到的問題。
CountryImport 做 dd($model)
沒看到資料的情況下。你就得考量你的 excel 是否能正確的解析資料處理。
這也是我上面告知,你得面對的問題。
因為 excel 轉換資料處理,一般都還是要透過檔案讀檔、解析等這些動作。而光檔案讀檔本身就得面臨許多問題,如權限之類的。
你就得一一去排查原因。
我連seeders是什麼都不知道
替你問Claude
這種情況確實令人困惑。既然程式在您的 Windows 11 和 VMware Ubuntu 22.04 環境中都正常運作,但在使用 cPanel 的伺服器上卻無反應,我們需要進行一些排查。以下是一些可能的原因和建議的解決步驟:
1. PHP 版本差異:
確認 cPanel 伺服器上的 PHP 版本與您的開發環境是否一致。某些函數或特性可能在較舊的 PHP 版本中不可用。
2. 權限問題:
檢查 seeder 檔案和相關目錄的權限是否正確設置。cPanel 環境可能有更嚴格的權限設置。
3. 資料庫連接:
確保 cPanel 環境中的資料庫連接設置正確。檢查資料庫名稱、使用者名稱和密碼是否正確。
4. 錯誤報告設置:
在 cPanel 的 PHP 設置中啟用錯誤報告。可以通過修改 php.ini 文件或在程式碼中添加以下行:
```php
ini_set('display_errors', 1);
error_reporting(E_ALL);
日誌檢查:
查看 cPanel 的錯誤日誌文件,可能會發現一些未顯示的錯誤信息。
執行時間限制:
如果匯入操作需要較長時間,可能會超出 PHP 的最大執行時間限制。嘗試在程式碼中增加執行時間限制:
set_time_limit(300); // 設置為 5 分鐘
記憶體限制:
檢查是否有足夠的記憶體分配給 PHP 進程。可以嘗試增加記憶體限制:
ini_set('memory_limit', '256M');
依賴項檢查:
確保所有必要的 PHP 擴展在 cPanel 環境中都已啟用。
代碼兼容性:
檢查代碼中是否使用了任何可能在 cPanel 環境中不兼容的函數或特性。
手動執行:
嘗試通過 SSH 連接到伺服器,手動執行 seeder,看看是否能獲得更多信息。
建議您逐步檢查這些可能的問題點。如果仍然無法解決,可能需要與 cPanel 主機提供商聯繫,尋求進一步的協助。他們可能會有更多關於伺服器特定配置的信息,這些信息可能影響到您的 seeder 執行。
is_file — Tells whether the filename is a regular file
看起來is_file
只能確認你提供的路徑之檔案名稱是否正常,
無法確認檔案是否存在,
你應該用file_exists
來確認,
再來,
檔案路徑我自己是建議使用絕對路徑,
所以你的filename可以修改成以下
$filename = database_path('sheets/ImportSheets/countries.xlsx');