Va bene la didattica ed il $z==0 piuttosto del !$z o ancor meglio inizializzare $z=true, fare while($z), e settarlo solo nel caos in cui $a==$b a false... ma qui c'è un grave errore di logica che ti fa cadere in un ciclo infinito ,dato che a ogni iterazione reinizializzi $a e $b vanificando l'istruzione $a++ ovvero $b++.
L'unico caso in sui non hai problemi è quando $a e $b sono uguali sin dalla prima iterazione.
![]()