PHILADELPHIA -- Roy Oswalt played the final two innings in left field against the Astros, which in itself should have been enough to classify Tuesday night's marathon contest against the Phillies as perhaps the craziest, wildest game in the Major Leagues this year.

So what if the teams battled for 16 innings, five hours and 20 minutes, exhausted their benches to the max and saw a player who was on the disabled list get ejected in the madness. As far as the Astros were concerned, it was an absolute thing of beauty.

The never-say-die Astros pushed across a pair of runs in the 16th inning without the benefit of hitting a ball out of the infield to outlast the Phillies, 4-2, in a game that ended when Oswalt -- forced into action when Ryan Howard got ejected in the 14th -- grounded out to third base to strand a pair of runners.

"Ices the cake, that one," said Astros reliever Jeff Fulchino, who got the win by pitching the final two innings. Houston's bullpen, which was without the services of closer Brandon Lyon, pitched seven scoreless innings after Jimmy Rollins hit a two-out solo homer off Wilton Lopez in the ninth to force extra innings.

The teams combined to use 43 players and threw 533 total pitches.

"I'm not sure what I just saw," Phillies right fielder Jayson Werth said. "I think I may go take a nap and think about it, [then] come back [Wednesday], refreshed and act like none of that happened. We'll find out. I haven't been playing the game as long as some people but that's the first time I've seen anything like that."

The Astros, winners of three in a row, ran their record at Citizens Bank Park to 14-7, which is the best record at the ballpark by an opposing team. It was Houston's longest game since losing in 16 innings at Atlanta on July 6, 2008.

"I really just feel like this is one of the craziest games I've ever been a part of, one of the more interesting ones to play in," said Astros right fielder Hunter Pence, who went 3-for-6. "It was a lot of fun. Those big at-bats are what you play the game for, especially because they're in a playoff race. It makes it that much more exciting to try to spoil it."

Pence sparked the Astros' 16th-inning rally when he beat out an infield single with one out while facing David Herndon, who was working his third inning as Philadelphia's eighth pitcher. Brett Wallace was hit by a pitch, and the Phils intentionally walked Jason Michaels after the runners moved up on a wild pitch.

That loaded the bases for Chris Johnson, who hit a grounder to third that was fielded by Placido Polanco. He threw late to second base trying to get Michaels, allowing Pence to score. Tommy Manzella followed with a grounder to a diving Jimmy Rollins, who flipped for a force out to second, but watched Manzella beat the throw to first to score Wallace.

"[It] just didn't seem like it was going to end," Manzella said. "Luckily, we were able to get a couple of runs across there and got the bases loaded, and they made two diving plays and we were lucky we got runs on both of them. We were able to hold them off and the bullpen did an unbelievable job."

Fernando Abad pitched two scoreless innings for the Astros in only his second Major League appearance. Mark Melancon, the club's sixth pitcher of the night, followed with three more scoreless innings to get the game to the 15th.

Melancon struck out Howard to end the 14th on a check swing that was called by third-base umpire Scott Barry on appeal, and Howard was quickly ejected for throwing his helmet and bat. That left the Phillies without any position players, forcing Oswalt into action. He caught a fly ball off the bat of Jason Castro to start the 15th, sending the remaining crowd into a frenzy.

"You know the first ball is going to go to him, and you knew he was going to go up hitting at some point in some situation, and that's the way it goes," Manzella said. "Especially when you empty your bench, other people have to contribute."

Oswalt wound up coming to the plate in the 16th representing the winning run after Fulchino walked Polanco unintentionally and Chase Utley intentionally. What was remaining of the largest crowd of the season at Citizens Bank Park rose to its feet and began chanting, "Let's go, Oswalt!" as he strolled to the plate.

"The loudest chant of the year, by far, was 'Let's go, Oswalt!' It brought a whole new energy and twist to the game," Pence said.

Fulchino got ahead of his former teammate 0-2 before throwing two balls, keeping the fans' hopes alive. Oswalt bounced the 2-2 pitch to third, where Johnson threw across the diamond for the final out. The Astros' dugout erupted onto the field.

"I threw that 0-2 pitch to Roy and I thought it was strike three, and I'm thinking to myself in the back of my mind, 'This isn't going to be easy,'" Fulchino said. "The next one's close. I was like, 'This is kind of fitting the way this game is going to end. I'm going to have to get him out.' It's a crazy game, but these things happen."

Starter Bud Norris delivered his third consecutive quality start by holding the Phillies to five hits and one run in six innings. Philadelphia starter Cole Hamels allowed five hits and two runs and struck out eight in seven innings, giving up a two-run homer to Carlos Lee in the fourth.

"It's great to see these guys leave it on the field for 16 innings," Norris said. "Nobody ever gave up one time, and obviously the bullpen did their job and the guys battled and played defense all 16 innings. That just shows how much tenacity and how much demeanor we have as a ballclub, and it shows a lot. It builds a lot of confidence in each other."