To ease maintenance I put all non-bundled extensions into a directory parallel to the MW base directory, and symlink to those downloaded extensions from ./extensions:
Most extensions work, however Echo is among the few that don't.
Upon running update.php I get:
PHP Warning: require_once(/var/www/wiki/mw-extensions/Echo-REL1_28-f55bdd9/maintenance/../../../maintenance/Maintenance.php): failed to open stream: No such file or directory in /var/www/wiki/mw-extensions/Echo-REL1_28-f55bdd9/maintenance/removeOrphanedEvents.php on line 9
PHP Fatal error: require_once(): Failed opening required '/var/www/wiki/mw-extensions/Echo-REL1_28-f55bdd9/maintenance/../../../maintenance/Maintenance.php' (include_path='/var/www/wiki/mediawiki-1.28.0/vendor/pear/pear_exception:/var/www/wiki/mediawiki-1.28.0/vendor/pear/console_getopt:/var/www/wiki/mediawiki-1.28.0/vendor/pear/pear-core-minimal/src:/var/www/wiki/mediawiki-1.28.0/vendor/pear/mail_mime:/var/www/wiki/mediawiki-1.28.0/vendor/pear/mail_mime-decode:/var/www/wiki/mediawiki-1.28.0/vendor/pear/net_socket:/var/www/wiki/mediawiki-1.28.0/vendor/pear/net_smtp:/var/www/wiki/mediawiki-1.28.0/vendor/pear/mail:.:/usr/share/php') in /var/www/wiki/mw-extensions/Echo-REL1_28-f55bdd9/maintenance/removeOrphanedEvents.php on line 9
All files reported missing actually do exist. I think it has to do with how the extnsions constructs its own path in PHP.