While South Africa grabbed a 1-0 lead in the three-match series, the visitors squandered a golden opportunity to script a memorable win outside the sub-continent.
Needing 208 on day four for their third ever Test win on South African soil, the Indian batsmen let their team down for the second time in the match, getting skittled out for 135 in 42.4 overs.
The game finished well inside three days despite a full day's play being washed out.
Philander was simply outstanding with his pace and precision, ending with a career-best six for 42 and match haul of nine wickets.
Also Read
Mornel Morkel and Kagiso Rabada played the supporting role well, finishing with two wickets apiece in the second innings.
With India reeling at 82 for seven, R Ashwin (37) and Bhuvneshwar Kumar saved them the embarrassment of being bowled out for under 100.
The duo shared a 49-run stand for the eighth wicket, the highest of the innings, but it folded quickly after Philander had Ashwin caught behind with the keeper standing up.
The latter survived twice via DRS reviews for caught behind and lbw appeals. Vijay wasn't third time lucky though, caught behind off Philander in the 8th over as the slide began for India.
Six balls later, Dhawan was caught pulling much like the first innings, only this time off Morkel (2-39). Four overs later, India were struggling at 39/3 as Cheteshwar Pujara (4) was caught behind off Morkel too.
Virat Kohli (28) and Rohit Sharma (10) stemmed the slide by adding 32 runs for the fourth wicket. After drinks though, Philander returned from the other end and trapped Kohli in front of the wicket.
First innings' hero Hardik Pandya (1) then gave slip catching practice off Rabada as India lost eight wickets for 52 runs in this session. Wriddhiman Saha (8) fell at the stroke of tea, trapped lbw by Rabada.
Post tea, Ashwin and Kumar looked to bat for time. They put on 49 runs for the 8th wicket to take India past the 100- mark and raised visions of an improbable win.
Philander picked up his 12th five-wicket haul as Mohammed Shami (4) was caught at second slip two balls later. He finished things off in style as Jasprit Bumrah (0) was out in the same fashion on the very next ball. Philander improved on his previous best of 6-44 against New Zealand in March 2012.
This was after Mohammed Shami and Jasprit Bumrah shared six wickets as South Africa were bowled out for 130 runs (41.2 overs) in their second innings at the stroke of lunch.
Starting from day two overnight 65/2, the slide began in the second over of the morning. Shami had Hashim Amla (4) caught at gully with Rohit Sharma taking a low catch. The decision went up to the TV umpire but he didn't find conclusive evidence to overturn the soft signal.
Four overs later, Shami sent back Rabada (5), caught at second slip. In the 29th over then, when Bumrah had Faf du Plessis (0) caught behind off a snorter, South Africa were struggling at 82/5.
South Africa crossed 100 in the 36th over as Keshav Maharaj (15) played a few strokes. Bhuvneshwar Kumar (2-33) then got down to action with the batsman caught behind in the 39th over.
Saha took his 10th catch of the Test when Morne Morkel (2) was caught behind off Kumar two overs later. This is an Indian record overseas as Saha went past MS Dhoni who had nine catches against Australia in his last Test at MCG in 2014.
Day three was completely washed out due to persistent rain.
Disclaimer: No Business Standard Journalist was involved in creation of this content