I comment everything I think is ambiguous, or should be explained. Often, I over comment. Why? Because you never know who will work on your code. I like to imagine a situation where they replace half the team with monkeys who only understand that when they press enter on a line, they get a banana. So, if they at least learn to read, they won't change my logic without reading the comments first.
Case and point:
// Delete the helloworld file
exec("rm -f helloworld.txt")
Won't get changed to:
exec("rm -rf /")
Unlikely, I know, but even some good developers are known to change logic because it doesn't look right and not because there was a bug, or requirement change.