[原]WordPress 3.9使用PostgreSQL数据库问题的解决_MySQL
WordPress
我一向不喜欢mysql,这事在blog上说过很多次了。所以在我部署的几个wordpress实例中,有部分是使用postgresql数据库的。
用pgsql代替mysql的最大好处是资源可以节约很多。mysql即使只用MyISAM引擎,占用的内存也比标准配置的pgsql大得多——在跑同样的WP应用情况下。更不用说pgsql提供的功能比mysql的InnoDB还多——虽然在WP中用不到。
但是因为WP在代码中是直接使用mysql的,要实现数据库的更换,需要一个插件:PG4WP。不过它的最新版本也已经是两年前的1.3.0了,相当OUT,但是没办法,没有别的选择。
这个插件的实现原理是:动态替换wp-db.php的内容,把其中的mysql API替换为pgsql API(实际上是替换为一套中间API,然后可以通过配置选择使用mysql或是pgsql),最后通过eval运行这个替换后的wp-db.php。
eval……这个……的确比较简单粗暴一点,但是直接有效,性能也基本没有影响(pgsql对mysql的性能优势足以弥补PHP的这点性能损失)。
但是昨天更新到最新的WordPress 3.9以后,发现网站打不开了,看了一下日志,有这样的错误:
2014/05/04 22:16:22 [error] .... FastCGI sent in stderr: "PHP message: PHP Warning: Missing argument 3 for wpsql_result(), called in /.../wp-content/pg4wp/core.php(32) : eval()'d code on line 755 and defined in /../wp-content/pg4wp/driver_pgsql.php on line 58PHP message: PHP Warning: pg_fetch_result() expects parameter 1 to be resource, boolean given in /.../wp-content/pg4wp/driver_pgsql.php on line 59PHP message: PHP Fatal error: Call to undefined function wpsql_errno() in /.../wp-content/pg4wp/core.php(32) : eval()'d code on line 1531" while reading response header from upstream, client: xx.xx.xx.xx, server: xxxxxx, request: "GET / HTTP/1.1", upstream: "xxxxx", host: "xxxxxx"
基本原因是两个:
1、wp-db.php中 调用 mysql_result() 的参数与 pg_fetch_result() 要求不一致(wpsql_result就是pg4wp包装的中间API函数之一),具体在wp-db.php中的第755行,这里只使用了两个参数,但wpsql_result需要三个参数,而且wpsql_result中未处理$result为FALSE的情况。
2、wp-db.php中调用了mysql_errno(),但是pg4wp包装的中间API未实现这个函数,具体在wp-db.php中的第1531行。
放狗搜了一下解决方案,找到插件论坛上这两个帖:
http://wordpress.org/support/topic/not-working-with-39-44
http://wordpress.org/support/topic/not-working-with-39
其中第一个帖比较好地解决了第一个问题,但第二个帖对第二个问题的解决方案不好。因为这个方法是直接修改wp-db.php,如果以后WP再升级,这种修改将会被覆盖,所以还是在pg4wp里修改比较好。
最终解决方案,在driver_pgsql.php中找到wpsql_result函数,然后作如下修改:
function wpsql_result($result, $i, $fieldname = null) { if (is_resource($result)) { if ($fieldname) { return pg_fetch_result($result, $i, $fieldname); } else { return pg_fetch_result($result, $i); } } } function wpsql_errno($conn) { if (pg_last_error===FALSE) { return 0; } else { return -1; } }
保存后再访问网站已不再出错。
话说从PHP5.5开始传统的mysql API已经被确定为过时不能再使用,但是最新的3.9版WordPress还是绑定在mysql上。虽然据说已经换成了PDO,并且只在没有PDO的情况下使用旧的API。另外,在未支持PDO的旧版WP上也可以用WP DB Driver这种插件来支持PHP5.5,但这毕竟不是长久之计,而且这货只支持PDO-mysql和mysqli,并不能使用PDO驱动其它数据库(比如SQLite或pgsql)。
据WP官方十年前的说法《Using Alternative Databases》是因为除了接口不同以外,SQL语法上也有不同,所以才不考虑mysql以外的数据库。但问题是也没有看到WP用到了什么高级mysql技术,pg4wp的简单粗暴方式就可以解决,唯一能想到的理由就是:
改用其它数据库之后插件之类的兼容性没法保证。

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



MySQL adalah sistem pengurusan pangkalan data sumber terbuka. 1) Buat Pangkalan Data dan Jadual: Gunakan perintah Createdatabase dan Createtable. 2) Operasi Asas: Masukkan, Kemas kini, Padam dan Pilih. 3) Operasi lanjutan: Sertai, subquery dan pemprosesan transaksi. 4) Kemahiran Debugging: Semak sintaks, jenis data dan keizinan. 5) Cadangan Pengoptimuman: Gunakan indeks, elakkan pilih* dan gunakan transaksi.

Anda boleh membuka phpmyadmin melalui langkah -langkah berikut: 1. Log masuk ke panel kawalan laman web; 2. Cari dan klik ikon phpmyadmin; 3. Masukkan kelayakan MySQL; 4. Klik "Login".

Buat pangkalan data menggunakan Navicat Premium: Sambungkan ke pelayan pangkalan data dan masukkan parameter sambungan. Klik kanan pada pelayan dan pilih Buat Pangkalan Data. Masukkan nama pangkalan data baru dan set aksara yang ditentukan dan pengumpulan. Sambung ke pangkalan data baru dan buat jadual dalam penyemak imbas objek. Klik kanan di atas meja dan pilih masukkan data untuk memasukkan data.

MySQL dan SQL adalah kemahiran penting untuk pemaju. 1.MYSQL adalah sistem pengurusan pangkalan data sumber terbuka, dan SQL adalah bahasa standard yang digunakan untuk mengurus dan mengendalikan pangkalan data. 2.MYSQL menyokong pelbagai enjin penyimpanan melalui penyimpanan data yang cekap dan fungsi pengambilan semula, dan SQL melengkapkan operasi data yang kompleks melalui pernyataan mudah. 3. Contoh penggunaan termasuk pertanyaan asas dan pertanyaan lanjutan, seperti penapisan dan penyortiran mengikut keadaan. 4. Kesilapan umum termasuk kesilapan sintaks dan isu -isu prestasi, yang boleh dioptimumkan dengan memeriksa penyataan SQL dan menggunakan perintah menjelaskan. 5. Teknik pengoptimuman prestasi termasuk menggunakan indeks, mengelakkan pengimbasan jadual penuh, mengoptimumkan operasi menyertai dan meningkatkan kebolehbacaan kod.

Anda boleh membuat sambungan MySQL baru di Navicat dengan mengikuti langkah -langkah: Buka aplikasi dan pilih Sambungan Baru (Ctrl N). Pilih "MySQL" sebagai jenis sambungan. Masukkan nama host/alamat IP, port, nama pengguna, dan kata laluan. (Pilihan) Konfigurasikan pilihan lanjutan. Simpan sambungan dan masukkan nama sambungan.

Memulihkan baris yang dipadam secara langsung dari pangkalan data biasanya mustahil melainkan ada mekanisme sandaran atau transaksi. Titik Utama: Rollback Transaksi: Jalankan balik balik sebelum urus niaga komited untuk memulihkan data. Sandaran: Sandaran biasa pangkalan data boleh digunakan untuk memulihkan data dengan cepat. Snapshot Pangkalan Data: Anda boleh membuat salinan bacaan pangkalan data dan memulihkan data selepas data dipadam secara tidak sengaja. Gunakan Pernyataan Padam dengan berhati -hati: Periksa syarat -syarat dengan teliti untuk mengelakkan data yang tidak sengaja memadamkan. Gunakan klausa WHERE: Secara jelas menentukan data yang akan dipadam. Gunakan Persekitaran Ujian: Ujian Sebelum Melaksanakan Operasi Padam.

Redis menggunakan satu seni bina berulir untuk memberikan prestasi tinggi, kesederhanaan, dan konsistensi. Ia menggunakan I/O multiplexing, gelung acara, I/O yang tidak menyekat, dan memori bersama untuk meningkatkan keserasian, tetapi dengan batasan batasan konkurensi, satu titik kegagalan, dan tidak sesuai untuk beban kerja yang berintensifkan.

Bagaimana untuk menyambung ke MySQL menggunakan phpmyadmin? URL untuk mengakses phpmyadmin biasanya http: // localhost/phpmyadmin atau http: // [alamat ip pelayan anda]/phpmyadmin. Masukkan nama pengguna dan kata laluan MySQL anda. Pilih pangkalan data yang ingin anda sambungkan. Klik butang "Sambungan" untuk membuat sambungan.
