Test de WordPress XML-RPC interface

Bij problemen met de WordPress XML-RPC interface zijn er verschillende manieren om de werking te testen:

Jetpack

https://jetpack.wordpress.com/jetpack.testsite/1/?url=https://www.pronamic.nl/xmlrpc.php

cURL

curl -d "<?xml version="1.0" encoding="iso-8859-1"?> <methodCall><methodName>demo.sayHello</methodName></methodCall>" https://www.pronamic.nl/xmlrpc.php

SiteGround timeout verhogen

Veel WordPress gebruikers zullen wel eens tegen timeouts aanlopen. Vooral bij bulk acties in WordPress wil dit nog wel eens voorkomen. Gelukkig kan de timeout limiet vaak verhoogd worden via bijvoorbeeld een .htaccess bestand. Bij SiteGround kan de limiet verhoogd worden via onderstaande code:

# BEGIN Custom timeout
<IfModule mod_dtimeout.c>
	<Files ~ ".php">
		SetEnvIf Request_URI "edit.php" DynamicTimeout=3600
	</Files>
</IfModule>
# END Custom timeout

Bron: https://wordpress.org/support/topic/temporary-failure/

PHP 7 Cron Jobs bij SiteGround

Gebruikers van SiteGround weten waarschijnlijk wel dat SiteGround altijd bovenop nieuwe ontwikkelingen zit. Zo hadden ze PHP 7 al vrij snel beschikbaar gesteld aan hun gebruikers. Door een regel op te nemen in een .htaccess  bestand kan PHP 7 eenvoudig geactiveerd worden:

AddHandler application/x-httpd-php70 .php .php5 .php4 .php3

Meer informatie hierover is te vinden op de volgende SiteGround pagina’s:

Voor zover mij bekend werkt dit echter niet voor Cron Jobs die direct de PHP executable aanroepen via bijvoorbeeld:

/usr/local/bin/php /home/username/public_html/wp-cron.php

Nou is het vrij eenvoudig om de PHP 7 executable te gebruiken door bovestaande commando aan te passen:

/usr/local/bin/php70 /home/username/public_html/wp-cron.php

Dit resulteerde bij mij echter in de volgende fout:

Cannot load Zend OPcache - it was already loaded

Reden om even te informeren bij de SiteGround support afdeling:

PHP 7 Cron Jobs bij SiteGround

Helaas werd de chatsessie zomaar beëindigd en heeft SiteGround niet opnieuw contact met me opgenomen. Na een korte zoektocht kwam ik echter zelf een oplossing tegen:

Usage: php [options] [-f] <file> [--] [args...]
   php [options] -r <code> [--] [args...]
   php [options] [-B <begin_code>] -R <code> [-E <end_code>] [--] [args...]
   php [options] [-B <begin_code>] -F <file> [-E <end_code>] [--] [args...]
   php [options] -S <addr>:<port> [-t docroot]
   php [options] -- [args...]
   php [options] -a

  -a               Run as interactive shell
  -c <path>|<file> Look for php.ini file in this directory
  -n               No configuration (ini) files will be used
  -d foo[=bar]     Define INI entry foo with value 'bar'
  -e               Generate extended information for debugger/profiler
  -f <file>        Parse and execute <file>.
  -h               This help
  -i               PHP information
  -l               Syntax check only (lint)
  -m               Show compiled in modules
  -r <code>        Run PHP <code> without using script tags <?..?>
  -B <begin_code>  Run PHP <begin_code> before processing input lines
  -R <code>        Run PHP <code> for every input line
  -F <file>        Parse and execute <file> for every input line
  -E <end_code>    Run PHP <end_code> after processing all input lines
  -H               Hide any passed arguments from external tools.
  -S <addr>:<port> Run with built-in web server.
  -t <docroot>     Specify document root <docroot> for built-in web server.
  -s               Output HTML syntax highlighted source.
  -v               Version number
  -w               Output source with stripped comments and whitespace.
  -z <file>        Load Zend extension <file>.

  args...          Arguments passed to script. Use -- args when first argument
                   starts with - or script is read from stdin

  --ini            Show configuration file names

  --rf <name>      Show information about function <name>.
  --rc <name>      Show information about class <name>.
  --re <name>      Show information about extension <name>.
  --rz <name>      Show information about Zend extension <name>.
  --ri <name>      Show configuration for extension <name>.

Door de -n optie toe te voegen aan het commando was de foutmelding verdwenen.

/usr/local/bin/php70 -n /home/username/public_html/wp-cron.php

Mollie Recurring testen betaling blijft pending

Bij Pronamic werken we momenteel hard aan de ondersteuning van Mollie Recurring in de Pronamic iDEAL plugin. Hierbij liepen we tegen het probleem aan dat test incasso betalingen de status pending  bleven houden. We hebben daarom zojuist even geïnformeerd bij Mollie wat we over het hoofd zien:

Hallo Mollie,

We zijn momenteel bezig met de Mollie Recurring API en lopen tegen een probleem aan. De test directdebit betaling blijft de status pending houden terwijl er een valid mandate is:

curl -X GET https://api.mollie.nl/v1/payments/tr_********** -H "Authorization: Bearer test_******************************"
curl -X GET https://api.mollie.nl/v1/customers/cst_**********/mandates/mdt_********** -H "Authorization: Bearer test_******************************"

Zien wij iets over het hoofd?

Het handige van Mollie is dat de API ook eenvoudig via curl  is aan te roepen. In combinatie met tools zoals underscore-cli of jq kun je zo de Mollie API eenvoudig testen.

jq

brew install jq
curl -X GET https://api.mollie.nl/v1/payments/tr_********** -H "Authorization: Bearer test_******************************" | jq

Mollie API test curl jq

underscore-cli

npm install -g underscore-cli
curl -X GET https://api.mollie.nl/v1/payments/tr_********** -H "Authorization: Bearer test_******************************" | underscore print --color

Mollie API test curl underscore

Update maandag 10 oktober

Inmiddels hebben we een reactie gekregen van Mollie:

In de testmodus klopt dit inderdaad. Om recurring te testen kun je dit het beste doen met de Creditcard betaalmethode. Dit zal hetzelfde werken als met SEPA-incasso.

Als er nog vragen zijn, horen wij deze graag. Veel informatie is overigens ook terug te vinden op onze Support-pagina: https://www.mollie.com/nl/support

Het is wel jammer dat dit in testmodus niet correct werkt en Mollie ook geen stappen lijkt te nemen om dit of de documentatie hiervan te verbeteren.

Van KPN Internet Thuis Instap naar Alles-in-1 Standaard

Helaas is op het adres waar ik woon geen TV kabel beschikbaar dus zijn we aangewezen op internet via de telefoonlijn. Hiervoor heb ik jaren gebruik gemaakt van het KPN Internet Thuis Instap pakket. Dit pakket heeft een download snelheid van 20 Mbit/s en een upload snelheid tot 2 Mbit/s.

Als webdeveloper merk ik zo nu en dan toch dat de 20 Mbit/s niet heel snel is. Vandaag ben ik daarom overgestapt naar het Alles-in-1 Standaard pakket van KPN. Dit pakket heeft een download snelheid van 60 Mbit/s en een een upload snelheid tot 6 Mbit/s. Bij het bestellen stond echter wel de volgende opmerking:

Op dit adres is de maximaal haalbare internetsnelheid 36 Mbit/s down en 6 Mbit/s up.

Ik ben erg benieuwd of na de upgrade, die pas over een paar weken actief zal zijn, mijn internetsnelheid is verbeterd. Ik heb daarom de snelheid even gemeten met een aantal tools:

Speedtest.net

Speedtest.net geeft momenteel een download snelheid van 8,66 Mb/s en een upload snelheid van 1,41 Mb/s.

http://www.speedtest.net/my-result/5537965661 Speedtest.net resultaten

Speedtest.nl

Speedtest.nl resultaten

KPN Speedtest

KPN Speedtest geeft momenteel een download snelheid van 12,56 Mbps en een upload snelheid van 1,54 Mbps.

kpn-speedtest-results

Ik ben erg benieuwd of na de upgrade de download snelheid in de buurt komt van de 36 Mbit/s. Zodra de upgrade door KPN is uitgevoerd zal ik dit bericht voorzien van een update.

Problemen met MariaDB versie 10.1.16 op OS X El Capitan

In het bericht “Problemen met MariaDB versie 10.1.8 op OS X El Capitan” schreef ik al eerder over problemen met MariaDB. Inmiddels heb ik MariaDB bijgewerkt naar versie 10.1.16 met behulp van Brew. Helaas kreeg ik nu ook weer fouten bij het opstarten van MariaDB:

➜  ~ mysqld
2016-07-27  9:12:38 140735199690752 [Note] mysqld (mysqld 10.1.16-MariaDB) starting as process 7611 ...
2016-07-27  9:12:38 140735199690752 [Warning] Setting lower_case_table_names=2 because file system for /usr/local/var/mysql/ is case insensitive
2016-07-27  9:12:38 140735199690752 [Note] InnoDB: Using mutexes to ref count buffer pool pages
2016-07-27  9:12:38 140735199690752 [Note] InnoDB: The InnoDB memory heap is disabled
2016-07-27  9:12:38 140735199690752 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2016-07-27  9:12:38 140735199690752 [Note] InnoDB: Memory barrier is not used
2016-07-27  9:12:38 140735199690752 [Note] InnoDB: Compressed tables use zlib 1.2.5
2016-07-27  9:12:38 140735199690752 [Note] InnoDB: Using SSE crc32 instructions
2016-07-27  9:12:38 140735199690752 [Note] InnoDB: Initializing buffer pool, size = 128.0M
2016-07-27  9:12:38 140735199690752 [Note] InnoDB: Completed initialization of buffer pool
2016-07-27  9:12:38 140735199690752 [Note] InnoDB: Highest supported file format is Barracuda.
2016-07-27  9:12:38 140735199690752 [Note] InnoDB: 128 rollback segment(s) are active.
2016-07-27  9:12:38 140735199690752 [Note] InnoDB: Waiting for purge to start
2016-07-27  9:12:38 140735199690752 [Note] InnoDB:  Percona XtraDB (http://www.percona.com) 5.6.30-76.3 started; log sequence number 3504876906
2016-07-27  9:12:38 123145313034240 [Note] InnoDB: Dumping buffer pool(s) not yet started
2016-07-27  9:12:38 140735199690752 [Note] Plugin 'FEEDBACK' is disabled.
2016-07-27  9:12:38 140735199690752 [Note] Recovering after a crash using tc.log
2016-07-27  9:12:38 140735199690752 [ERROR] Recovery failed! You must enable all engines that were enabled at the moment of the crash
2016-07-27  9:12:38 140735199690752 [ERROR] Crash recovery failed. Either correct the problem (if it's, for example, out of memory error) and restart, or delete tc log and start mysqld with --tc-heuristic-recover={commit|rollback}
2016-07-27  9:12:38 140735199690752 [ERROR] Can't init tc log
2016-07-27  9:12:38 140735199690752 [ERROR] Aborting

Dit keer kon ik het probleem echter oplossen door het tc log bestand te verwijderen:

mv /usr/local/var/mysql/tc.log /usr/local/var/mysql/tc.log.bak

Hier na kon ik MariaDB zonder problemen opstarten:

➜  ~ mysql.server start

WordPress SAVEQUERIES invloed op performance

Voor debug en ontwikkel doeleinden kan het soms handig zijn om alle WordPress queries op te slaan. Dit kan gerealiseerd worden door in je code de SAVEQUERIES constante op true te zetten. Vaak wordt dit toegevoegd aan het WordPress configuratie bestand wp-config.php. Er zijn echter ook plugins die deze constante op true zetten, bijvoorbeeld: Query Monitor. Het wil dan ook wel eens voorkomen dat maatwerk code de define( 'SAVEQUERIES', true ); definitie bevat. Voor productie omgevingen is dit echter vaak niet gewenst om dit impact kan hebben op de performance van een website. Het kan soms echter lastig zijn om te achterhalen waar de SAVEQUERIES constante op true is gezet. Gelukkig kan met grep eenvoudig gezocht worden naar alle bestanden met daarin SAVEQUERIES:

grep -r -H "SAVEQUERIES" *

Savvii VPS productie en staging

Gebruikers van een Savvii VPS hebben de mogelijkheid om SSH toegang te krijgen. Dit kan erg handig zijn om bijvoorbeeld snel een backup te maken of een kopie te maken van een website. Voor het opzetten van een nieuwe actuele staging omgeving kun je als volgt te werken gaan:

Productie | staging

Allereerst is het handig dat productie en staging omgevingen met elkaar kunnen communiceren via SSH. Hiervoor is het handig om een nieuwe SSH key aan te maken op de productie omgeving en deze toe te voegen aan de staging omgeving.

Productie

ssh user1@user1.savviihq.com

ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -f ~/.ssh/pronamic_rsa

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/pronamic_rsa

Localhost

scp user1@user1.savviihq.com:~/.ssh/pronamic_rsa.pub ~/Downloads/pronamic_rsa.pub

scp ~/Downloads/pronamic_rsa.pub user2@user2.savviihq.com:~/tmp/pronamic_rsa.pub

Staging

ssh user2@user2.savviihq.com

cat ~/tmp/pronamic_rsa.pub >> ~/.ssh/authorized_keys

rm ~/tmp/pronamic_rsa.pub

Productie » staging

ssh user1@user1.savviihq.com

cd ~/wordpress/current

echo "wp-config.php" > staging-exclude.txt
echo "wp-content/infinitewp/backups" >> staging-exclude.txt
echo "wp-content/mu-plugins" >> staging-exclude.txt
echo "wp-content/mysql" >> staging-exclude.txt
echo "wp-content/uploads/2002" >> staging-exclude.txt
echo "wp-content/uploads/2003" >> staging-exclude.txt
echo "wp-content/uploads/2004" >> staging-exclude.txt
echo "wp-content/uploads/2005" >> staging-exclude.txt
echo "wp-content/uploads/2006" >> staging-exclude.txt
echo "wp-content/uploads/2007" >> staging-exclude.txt
echo "wp-content/uploads/2008" >> staging-exclude.txt
echo "wp-content/uploads/2009" >> staging-exclude.txt
echo "wp-content/uploads/2010" >> staging-exclude.txt
echo "wp-content/uploads/2011" >> staging-exclude.txt
echo "wp-content/uploads/2012" >> staging-exclude.txt
echo "wp-content/uploads/2013" >> staging-exclude.txt
echo "wp-content/uploads/2014" >> staging-exclude.txt
echo "wp-content/uploads/2015" >> staging-exclude.txt
echo "wp-content/uploads/backwpup*" >> staging-exclude.txt
echo "wp-content/uploads/gravity_forms" >> staging-exclude.txt
echo "wp-content/uploads/sites" >> staging-exclude.txt

# wp db export current.sql
mysqldump --user=user1 --password=******** --add-drop-table user1 > current.sql

rsync -avuz --exclude-from=staging-exclude.txt . user2@user2.savviihq.com:~/wordpress/current

Het staging-exclude.txt bestand kun je in principe eenmalig aanmaken en in bijhouden welke mappen niet mee hoeven naar de staging omgeving. In bovenstaand voorbeeld heb ik veel uploads mappen uitgesloten.

Staging omgeving

ssh user2@user2.savviihq.com

cd ~/wordpress/current

# wp db reset
# wp db import current.sql
# wp search-replace 'http://user1.savviihq.com' 'http://user2.savviihq.com'

mysql --user=user2 --password=******** user2 < current.sql

WP-CLI

Helaas werkt WP-CLI momenteel niet op onze Savvii VPS’en. Hierdoor is het exporteren en importeren van de database nog wat omslachtig. Met WP-CLI zou dit vereenvoudig kunnen worden wp db export, wp db reset, wp db import en wp search-replace.

Resources

Problemen met MariaDB versie 10.1.8 op OS X El Capitan

Na het updaten van MariaDB via Brew naar versie 10.1.8 had ik problemen met het opstarten van de MySQL server.

~  mysqld
2015-10-28 10:45:19 140735257919488 [Note] mysqld (mysqld 10.1.8-MariaDB) starting as process 1069 ...
2015-10-28 10:45:19 140735257919488 [Warning] Setting lower_case_table_names=2 because file system for /usr/local/var/mysql/ is case insensitive
2015-10-28 10:45:19 140735257919488 [Note] InnoDB: Using mutexes to ref count buffer pool pages
2015-10-28 10:45:19 140735257919488 [Note] InnoDB: The InnoDB memory heap is disabled
2015-10-28 10:45:19 140735257919488 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2015-10-28 10:45:19 140735257919488 [Note] InnoDB: Memory barrier is not used
2015-10-28 10:45:19 140735257919488 [Note] InnoDB: Compressed tables use zlib 1.2.5
2015-10-28 10:45:19 140735257919488 [Note] InnoDB: Using CPU crc32 instructions
2015-10-28 10:45:19 140735257919488 [Note] InnoDB: Initializing buffer pool, size = 128.0M
2015-10-28 10:45:19 140735257919488 [Note] InnoDB: Completed initialization of buffer pool
2015-10-28 10:45:19 140735257919488 [Note] InnoDB: Highest supported file format is Barracuda.
2015-10-28 10:45:19 140735257919488 [Note] InnoDB: The log sequence numbers 2407038528 and 2407038528 in ibdata files do not match the log sequence number 2407038728 in the ib_logfiles!
2015-10-28 10:45:19 140735257919488 [Note] InnoDB: Database was not shutdown normally!
2015-10-28 10:45:19 140735257919488 [Note] InnoDB: Starting crash recovery.
2015-10-28 10:45:19 140735257919488 [Note] InnoDB: Reading tablespace information from the .ibd files...
2015-10-28 10:45:19 140735257919488 [Note] InnoDB: Restoring possible half-written data pages
2015-10-28 10:45:19 140735257919488 [Note] InnoDB: from the doublewrite buffer...
2015-10-28 10:45:19 140735257919488 [Note] InnoDB: 128 rollback segment(s) are active.
2015-10-28 10:45:19 140735257919488 [Note] InnoDB: Waiting for purge to start
2015-10-28 10:45:19 7000008b1000  InnoDB: Assertion failure in thread 123145311424512 in file btr0cur.cc line 5341
InnoDB: Failing assertion: rb_ctx != RB_NONE
InnoDB: We intentionally generate a memory trap.
InnoDB: Submit a detailed bug report to http://bugs.mysql.com.
InnoDB: If you get repeated assertion failures or crashes, even
InnoDB: immediately after the mysqld startup, there may be
InnoDB: corruption in the InnoDB tablespace. Please refer to
InnoDB: http://dev.mysql.com/doc/refman/5.6/en/forcing-innodb-recovery.html
InnoDB: about forcing recovery.
151028 10:45:19 [ERROR] mysqld got signal 6 ;
This could be because you hit a bug. It is also possible that this binary
or one of the libraries it was linked against is corrupt, improperly built,
or misconfigured. This error can also be caused by malfunctioning hardware.

To report this bug, see http://kb.askmonty.org/en/reporting-bugs

We will try our best to scrape up some info that will hopefully help
diagnose the problem, but since we have already crashed,
something is definitely wrong and this may fail.

Server version: 10.1.8-MariaDB
key_buffer_size=134217728
read_buffer_size=131072
max_used_connections=0
max_threads=153
thread_count=0
It is possible that mysqld could use up to
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 467104 K  bytes of memory
Hope that's ok; if not, decrease some variables in the equation.

Thread pointer: 0x0x0
Attempting backtrace. You can use the following information to find out
where mysqld died. If you see no messages after this, something went
terribly wrong...
stack_bottom = 0x0 thread_stack 0x48000
0   mysqld                              0x000000010f93bd21 my_print_stacktrace + 61
0   mysqld                              0x000000010f3dfffc handle_fatal_signal + 632
0   libsystem_platform.dylib            0x00007fff9501552a _sigtramp + 26
0   ???                                 0x0000000000000009 0x0 + 9
0   libsystem_c.dylib                   0x00007fff9f50237b abort + 129
0   mysqld                              0x000000010f782e39 _ZL28btr_check_blob_fil_page_typemmPKhm + 0
0   mysqld                              0x000000010f8cf80d _Z14row_purge_stepP9que_thr_t + 2334
0   mysqld                              0x000000010f8a2a1a _Z15que_run_threadsP9que_thr_t + 822
0   mysqld                              0x000000010f8f9862 _Z9trx_purgemmb + 2812
0   mysqld                              0x000000010f8eccb1 srv_purge_coordinator_thread + 2484
0   libsystem_pthread.dylib             0x00007fff94b169b1 _pthread_body + 131
0   libsystem_pthread.dylib             0x00007fff94b1692e _pthread_body + 0
0   libsystem_pthread.dylib             0x00007fff94b14385 thread_start + 13
The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains
information that should help you find out what is causing the crash.

Aangezien ik geen MariaDB/MySQL expert ben heb ik niet de oorzaak van dit probleem kunnen vinden. Gelukkig kun je met Brew eenvoudig terug naar een oudere versie.

brew switch mariadb 10.0.21

Hiermee was het probleem direct opgelost.

Brew update PHP 5.6 tidy: Unable to initialize module

Na het update van Brew pakketten liep ik tegen de volgende foutmelding aan:

PHP Warning: PHP Startup: tidy: Unable to initialize module
Module compiled with build ID=API20131226,NTS
PHP compiled with build ID=API20131226,NTS,debug
These options need to match
 in Unknown on line 0

Dergelijke problemen zijn vaak eenvoudig op te lossen door pakketten even opnieuw te installeren vanuit de bron:

brew reinstall php56-tidy --build-from-source