Sicher, dass das mysql_connect() überhaupt jemals ausgeführt wird?
shell_exec() wartet darauf, dass das Programm beendet wird, bevor es das PHP-Script weiterlaufen lässt. Der ssh-Befehl, den du verwendest (und der einige Ungereimtheiten enthält, dazu gleich) beendet aber nie.
Mein Vorschlag:
Unterschiede: Durch -f wird SSH angewiesen, in den Hintergrund zu forken, sodass shell_exec() das Script weiterlaufen lässt. Durch -N weist du SSH an, keinen Befehl auf dem Server auszuführen, weshalb du das sleep 20 sparen kannst (wird eh nicht ausgeführt).
Da du so keine Kontrolle mehr über das laufende ssh hast, solltest du entweder vorher checken, ob der Tunnel schon aufgebaut wurde, oder etwas anderes als shell_exec benutzen und ssh am Ende des Scripts wieder killen (je nachdem, ob das Script mehrfach ausgeführt wird oder als Daemon die ganze Zeit läuft). Schau dir dazu z.B. mal die proc_*()-Funktionen an.