MIAMI -- For Roy Halladay, less than perfect can still be awfully good.
Halladay (13-8) threw the second perfect game in Phillies history when he won May 29 on his last visit to Miami. He said he wasn't tempted to reminisce.
"The quicker you can turn the page on stuff like that, the better," he said. "To have it be a regular game and just go out and pitch is obviously beneficial for me, so I really didn't think about it."
This time the Marlins managed five hits against the right-hander, who struck out nine and lowered his ERA to 2.17. He hit a two-run single in the fourth.
"Forget his pitching. Let's talk about his hitting," manager Charlie Manuel said with a laugh.
The injury-plagued Phils need all the offensive help they can get. They played without slugger Ryan Howard, who before the game went on the 15-day disabled list because of a sprained left ankle. Jayson Werth replaced Howard in the cleanup spot and went 0 for 5 with four strikeouts.
"When you have big guys out of your lineup, it's more important that everybody does their job," Halladay said.
"If we keep playing like we've been playing," Phils right fielder Ben Francisco said, "we should be fine."
Francisco and Carlos Ruiz homered on consecutive pitches in the second inning. Francisco finished with three of the Phils' 13 hits, and Ruiz had four.
Halladay improved 3-1 in four starts against Florida this year with an ERA of 1.13. His streak of consecutive batters retired in Miami this season reached 30 before Dan Uggla hit his 24th homer leading off the second inning.
Uggla said Halladay looked a lot like the perfect-game pitcher.
"He still threw really good," Uggla said. "It just so happens we got a couple of hits. The other time we didn't."
Florida's Sean West (0-1), making his first start of the season, went five innings and allowed five runs, four earned. Uggla made two misplays at second base that led to two runs.
The crowd was announced at 19,378, and many fans wore Phillies hats.
The only time Florida's first two batters reached was in the seventh. Halladay then got Ronny Paulino to hit into a double play, and when Hector Luna flied out to end the inning, Halladay pounded his glove once in satisfaction as he walked to the dugout.
He departed after throwing 109 pitches.
"You feel like every time he's out there, good things should happen," Francisco said. "He has lived up to it this year. We've probably put a lot of pressure on him, but he has been good every night out, and it makes it pretty easy on us."
Chad Durbin pitched two innings to complete the eight-hitter.
Wobbly defense -- a problem for the Marlins all season -- hurt them in the fourth inning. Francisco singled off the glove of third baseman Luna, then took third when center fielder Cody Ross misplayed Ruiz's deep fly into a double. An intentional walk to Wilson Valdez loaded the bases with two outs, and Halladay followed with a two-run single off the glove of a diving Luna.
"I just happened to catch it right, I guess," Halladay said. "The ball got in the way of the bat."
He came into the game with only one RBI in 61 at-bats this season.
An error by Uggla helped the Phils score an unearned run in the fifth, which came home on Ruiz's two-out single. Uggla mishandled a potential inning-ending double play grounder in the seventh, and the Phils went on to score on an RBI single by Valdez.
"Sean West did a decent job keeping us in the game," Marlins manager Edwin Rodriguez said, "but we didn't play defense behind him."
The Marlins designated RHP Jorge Sosa for assignment. ... Halladay has pitched at least six innings in 50 consecutive road starts. ... Werth is 0 for 20 in his past six games in Miami.