I often end up with lots of little functions also, but for a different reason....I'm not that concerned about scoping issues - if I'm worried about leaving large lumps of redundant data sitting around I unset the variables responsible (what with reference counting and copy-on-write, it can be surprising how many references to the same datum there might be).
I tend to take each step in processing and think of it as a function. I might not make it a function at a time but I'll probably factor it out later.
Thing is, it usually turns out that each step can be characterised by which variables are in use, so those variables all end up in the function together, invisible from outside.
I don't use global variables much; well, ish. There might be a set of objects being passed around with some static fields set, so I guess I do have globals, but they're partitioned with class names.
Another thing is that I often think of functions in a functional programming way: ideally (unrealistically) the operation of a function should not depend on anything other than its arguments and should not affect anything other than its return value. You see what comes in and what goes out and that characterises the function completely. Obviously the rules re. OO are a bit more complex than that. Just how unrealistic that is can be illustrated by the fact that "echo" affects state beyond the function's return value, and that in a real fp language variables are constant. Still, cutting down on side-effects does simplify the bughunt