Soalan ini bertujuan untuk menjadi catatan yang bermaklumat untuk orang lain cari kerana nasib baik saya sudah menemui penyelesaiannya.
Saya cuba menjalankan arahan Wordpress-CLI sebagai tugas cron dalam crontab pada pelayan Cloudways. Perintah berjalan tanpa sebarang masalah secara langsung dalam terminal, tetapi gagal dengan ralat PHP yang membawa maut apabila dilancarkan menggunakan crontab.
Arahan asas Wordpress-CLI adalah seperti berikut:
wp migeratedb 配置文件 [id]
Memandangkan konteks di mana crontab dijalankan biasanya tidak diketahui dan pembolehubah $PATH mungkin tidak tersedia, saya mengubah suai arahan untuk menyediakan laluan mutlak yang diperlukan:
/usr/local/bin/wp migeratedb 配置文件 [id] --path=/absolute/path/to/wordpress/core/files
Begitu juga, arahan yang diubah suai ini juga berjalan dengan sempurna tanpa sebarang masalah apabila dilancarkan dari terminal.
Entri crontab akhir kelihatan seperti ini:
0 5 * * * /usr/local/bin/wp migeratedb 配置文件 [id] --path=/absolute/path/to/wordpress/core/files
Apabila dijalankan dari penjadual ia menghasilkan ralat berikut:
PHP Fatal error: require(): Failed opening required 'wp-salt.php' (include_path='.:/usr/share/php') in phar:///usr/local/bin/wp/vendor/wp-cli/config-command/src/Config_Command.php(444) : eval()'d code on line 34
Selepas beberapa percubaan, saya menyedari ralat ini berlaku untuk semua arahan WP-CLI kecuali yang sangat asas
wp --info
, menghasilkan output berikut:
OS: Linux 4.19.0-21-amd64 #1 SMP Debian 4.19.249-2 (2022-06-30) x86_64 Shell: /bin/sh PHP binary: /usr/bin/php7.4 PHP version: 7.4.33 php.ini used: /etc/php/7.4/cli/php.ini MySQL binary: /usr/bin/mysql MySQL version: mysql Ver 15.1 Distrib 10.4.20-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2 SQL modes: WP-CLI root dir: phar://wp-cli.phar/vendor/wp-cli/wp-cli WP-CLI vendor dir: phar://wp-cli.phar/vendor WP_CLI phar path: [absolute/path/to/user/home/directory] WP-CLI packages dir: WP-CLI cache dir: [absolute/path/to/user/home/directory]/.wp-cli/cache WP-CLI global config: WP-CLI project config: WP-CLI version: 2.7.1
Saya juga mencuba penyesuaian berikut tidak berjaya:
Muat turun wp-cli.phar baharu dan gunakannya dengan arahan.
Lihat dan tukar semua kebenaran folder terpakai
Cuba jalankan cronjob sebagai pengguna lain
Gunakan /usr/bin/php
更改命令来运行 wp-cli.phar
Saya akhirnya dapati bahawa ralat ini ada kaitan dengan cara penyedia pengehosan (dalam kes ini Cloudways) menyediakan konfigurasi WordPress dalam fail
wp-config.php
.Garam dan kunci kebenaran rahsia disimpan dalam fail berasingan yang dirujuk
wp-salt.php
。它可以通过以下方式直接在配置文件中引用:require('wp-salt.php')
dalam mesej ralat. Memandangkan ini bukan sebahagian daripada teras WordPress dan crontab berjalan dalam persekitaran yang berbeza, ia tidak dapat menentukan direktori yang betul di mana fail itu terletak danrequire()
gagal dengan ralat yang membawa maut.Untuk membetulkannya, tukar baris dalam
wp-config.php
中的行更改为require(__DIR__.'/wp-salt.php');
kepadarequire(__DIR__.'/wp-salt.php');
supaya fail sentiasa dirujuk dari direktori yang sama dengan fail konfigurasi.Pilihan lain ialah mengalih keluar baris sepenuhnya dan menggantikannya dengan kandungan daripada fail
wp-salt.php
, seperti yang dilakukan oleh teras WordPress.